/*
 Highcharts JS v6.1.1 (2018-06-27)

 (c) 2009-2016 Torstein Honsi

 License: www.highcharts.com/license
*/
(function(T, K) {
	"object" === typeof module && module.exports ? module.exports = T.document ? K(T) : K : T.Highcharts = K(T)
})("undefined" !== typeof window ? window : this, function(T) {
	var K = function() {
		var a = "undefined" === typeof T ? window : T,
			C = a.document,
			E = a.navigator && a.navigator.userAgent || "",
			F = C && C.createElementNS && !!C.createElementNS("http://www.w3.org/2000/svg", "svg").createSVGRect,
			n = /(edge|msie|trident)/i.test(E) && !a.opera,
			h = -1 !== E.indexOf("Firefox"),
			e = -1 !== E.indexOf("Chrome"),
			u = h && 4 > parseInt(E.split("Firefox/")[1],
				10);
		return a.Highcharts ? a.Highcharts.error(16, !0) : {
			product: "Highcharts",
			version: "6.1.1",
			deg2rad: 2 * Math.PI / 360,
			doc: C,
			hasBidiBug: u,
			hasTouch: C && void 0 !== C.documentElement.ontouchstart,
			isMS: n,
			isWebKit: -1 !== E.indexOf("AppleWebKit"),
			isFirefox: h,
			isChrome: e,
			isSafari: !e && -1 !== E.indexOf("Safari"),
			isTouchDevice: /(Mobile|Android|Windows Phone)/.test(E),
			SVG_NS: "http://www.w3.org/2000/svg",
			chartCount: 0,
			seriesTypes: {},
			symbolSizes: {},
			svg: F,
			win: a,
			marginNames: ["plotTop", "marginRight", "marginBottom", "plotLeft"],
			noop: function() {},
			charts: []
		}
	}();
	(function(a) {
		a.timers = [];
		var C = a.charts,
			E = a.doc,
			F = a.win;
		a.error = function(n, h) {
			n = a.isNumber(n) ? "Highcharts error #" + n + ": www.highcharts.com/errors/" + n : n;
			if(h) throw Error(n);
			F.console && console.log(n)
		};
		a.Fx = function(a, h, e) {
			this.options = h;
			this.elem = a;
			this.prop = e
		};
		a.Fx.prototype = {
			dSetter: function() {
				var a = this.paths[0],
					h = this.paths[1],
					e = [],
					u = this.now,
					y = a.length,
					q;
				if(1 === u) e = this.toD;
				else if(y === h.length && 1 > u)
					for(; y--;) q = parseFloat(a[y]), e[y] = isNaN(q) ? h[y] : u * parseFloat(h[y] - q) + q;
				else e = h;
				this.elem.attr("d",
					e, null, !0)
			},
			update: function() {
				var a = this.elem,
					h = this.prop,
					e = this.now,
					u = this.options.step;
				if(this[h + "Setter"]) this[h + "Setter"]();
				else a.attr ? a.element && a.attr(h, e, null, !0) : a.style[h] = e + this.unit;
				u && u.call(a, e, this)
			},
			run: function(n, h, e) {
				var u = this,
					y = u.options,
					q = function(a) {
						return q.stopped ? !1 : u.step(a)
					},
					x = F.requestAnimationFrame || function(a) {
						setTimeout(a, 13)
					},
					f = function() {
						for(var c = 0; c < a.timers.length; c++) a.timers[c]() || a.timers.splice(c--, 1);
						a.timers.length && x(f)
					};
				n !== h || this.elem["forceAnimate:" +
					this.prop] ? (this.startTime = +new Date, this.start = n, this.end = h, this.unit = e, this.now = this.start, this.pos = 0, q.elem = this.elem, q.prop = this.prop, q() && 1 === a.timers.push(q) && x(f)) : (delete y.curAnim[this.prop], y.complete && 0 === a.keys(y.curAnim).length && y.complete.call(this.elem))
			},
			step: function(n) {
				var h = +new Date,
					e, u = this.options,
					y = this.elem,
					q = u.complete,
					x = u.duration,
					f = u.curAnim;
				y.attr && !y.element ? n = !1 : n || h >= x + this.startTime ? (this.now = this.end, this.pos = 1, this.update(), e = f[this.prop] = !0, a.objectEach(f, function(a) {
					!0 !==
						a && (e = !1)
				}), e && q && q.call(y), n = !1) : (this.pos = u.easing((h - this.startTime) / x), this.now = this.start + (this.end - this.start) * this.pos, this.update(), n = !0);
				return n
			},
			initPath: function(n, h, e) {
				function u(a) {
					var d, l;
					for(b = a.length; b--;) d = "M" === a[b] || "L" === a[b], l = /[a-zA-Z]/.test(a[b + 3]), d && l && a.splice(b + 1, 0, a[b + 1], a[b + 2], a[b + 1], a[b + 2])
				}

				function y(a, d) {
					for(; a.length < l;) {
						a[0] = d[l - a.length];
						var c = a.slice(0, r);
						[].splice.apply(a, [0, 0].concat(c));
						v && (c = a.slice(a.length - r), [].splice.apply(a, [a.length, 0].concat(c)), b--)
					}
					a[0] =
						"M"
				}

				function q(a, b) {
					for(var c = (l - a.length) / r; 0 < c && c--;) d = a.slice().splice(a.length / p - r, r * p), d[0] = b[l - r - c * r], k && (d[r - 6] = d[r - 2], d[r - 5] = d[r - 1]), [].splice.apply(a, [a.length / p, 0].concat(d)), v && c--
				}
				h = h || "";
				var x, f = n.startX,
					c = n.endX,
					k = -1 < h.indexOf("C"),
					r = k ? 7 : 3,
					l, d, b;
				h = h.split(" ");
				e = e.slice();
				var v = n.isArea,
					p = v ? 2 : 1,
					I;
				k && (u(h), u(e));
				if(f && c) {
					for(b = 0; b < f.length; b++)
						if(f[b] === c[0]) {
							x = b;
							break
						} else if(f[0] === c[c.length - f.length + b]) {
						x = b;
						I = !0;
						break
					}
					void 0 === x && (h = [])
				}
				h.length && a.isNumber(x) && (l = e.length + x * p * r,
					I ? (y(h, e), q(e, h)) : (y(e, h), q(h, e)));
				return [h, e]
			}
		};
		a.Fx.prototype.fillSetter = a.Fx.prototype.strokeSetter = function() {
			this.elem.attr(this.prop, a.color(this.start).tweenTo(a.color(this.end), this.pos), null, !0)
		};
		a.merge = function() {
			var n, h = arguments,
				e, u = {},
				y = function(e, n) {
					"object" !== typeof e && (e = {});
					a.objectEach(n, function(f, c) {
						!a.isObject(f, !0) || a.isClass(f) || a.isDOMElement(f) ? e[c] = n[c] : e[c] = y(e[c] || {}, f)
					});
					return e
				};
			!0 === h[0] && (u = h[1], h = Array.prototype.slice.call(h, 2));
			e = h.length;
			for(n = 0; n < e; n++) u = y(u,
				h[n]);
			return u
		};
		a.pInt = function(a, h) {
			return parseInt(a, h || 10)
		};
		a.isString = function(a) {
			return "string" === typeof a
		};
		a.isArray = function(a) {
			a = Object.prototype.toString.call(a);
			return "[object Array]" === a || "[object Array Iterator]" === a
		};
		a.isObject = function(n, h) {
			return !!n && "object" === typeof n && (!h || !a.isArray(n))
		};
		a.isDOMElement = function(n) {
			return a.isObject(n) && "number" === typeof n.nodeType
		};
		a.isClass = function(n) {
			var h = n && n.constructor;
			return !(!a.isObject(n, !0) || a.isDOMElement(n) || !h || !h.name || "Object" ===
				h.name)
		};
		a.isNumber = function(a) {
			return "number" === typeof a && !isNaN(a) && Infinity > a && -Infinity < a
		};
		a.erase = function(a, h) {
			for(var e = a.length; e--;)
				if(a[e] === h) {
					a.splice(e, 1);
					break
				}
		};
		a.defined = function(a) {
			return void 0 !== a && null !== a
		};
		a.attr = function(n, h, e) {
			var u;
			a.isString(h) ? a.defined(e) ? n.setAttribute(h, e) : n && n.getAttribute && ((u = n.getAttribute(h)) || "class" !== h || (u = n.getAttribute(h + "Name"))) : a.defined(h) && a.isObject(h) && a.objectEach(h, function(a, e) {
				n.setAttribute(e, a)
			});
			return u
		};
		a.splat = function(n) {
			return a.isArray(n) ?
				n : [n]
		};
		a.syncTimeout = function(a, h, e) {
			if(h) return setTimeout(a, h, e);
			a.call(0, e)
		};
		a.clearTimeout = function(n) {
			a.defined(n) && clearTimeout(n)
		};
		a.extend = function(a, h) {
			var e;
			a || (a = {});
			for(e in h) a[e] = h[e];
			return a
		};
		a.pick = function() {
			var a = arguments,
				h, e, u = a.length;
			for(h = 0; h < u; h++)
				if(e = a[h], void 0 !== e && null !== e) return e
		};
		a.css = function(n, h) {
			a.isMS && !a.svg && h && void 0 !== h.opacity && (h.filter = "alpha(opacity\x3d" + 100 * h.opacity + ")");
			a.extend(n.style, h)
		};
		a.createElement = function(n, h, e, u, y) {
			n = E.createElement(n);
			var q =
				a.css;
			h && a.extend(n, h);
			y && q(n, {
				padding: 0,
				border: "none",
				margin: 0
			});
			e && q(n, e);
			u && u.appendChild(n);
			return n
		};
		a.extendClass = function(n, h) {
			var e = function() {};
			e.prototype = new n;
			a.extend(e.prototype, h);
			return e
		};
		a.pad = function(a, h, e) {
			return Array((h || 2) + 1 - String(a).replace("-", "").length).join(e || 0) + a
		};
		a.relativeLength = function(a, h, e) {
			return /%$/.test(a) ? h * parseFloat(a) / 100 + (e || 0) : parseFloat(a)
		};
		a.wrap = function(a, h, e) {
			var n = a[h];
			a[h] = function() {
				var a = Array.prototype.slice.call(arguments),
					q = arguments,
					x = this;
				x.proceed = function() {
					n.apply(x, arguments.length ? arguments : q)
				};
				a.unshift(n);
				a = e.apply(this, a);
				x.proceed = null;
				return a
			}
		};
		a.formatSingle = function(n, h, e) {
			var u = /\.([0-9])/,
				y = a.defaultOptions.lang;
			/f$/.test(n) ? (e = (e = n.match(u)) ? e[1] : -1, null !== h && (h = a.numberFormat(h, e, y.decimalPoint, -1 < n.indexOf(",") ? y.thousandsSep : ""))) : h = (e || a.time).dateFormat(n, h);
			return h
		};
		a.format = function(n, h, e) {
			for(var u = "{", y = !1, q, x, f, c, k = [], r; n;) {
				u = n.indexOf(u);
				if(-1 === u) break;
				q = n.slice(0, u);
				if(y) {
					q = q.split(":");
					x = q.shift().split(".");
					c = x.length;
					r = h;
					for(f = 0; f < c; f++) r && (r = r[x[f]]);
					q.length && (r = a.formatSingle(q.join(":"), r, e));
					k.push(r)
				} else k.push(q);
				n = n.slice(u + 1);
				u = (y = !y) ? "}" : "{"
			}
			k.push(n);
			return k.join("")
		};
		a.getMagnitude = function(a) {
			return Math.pow(10, Math.floor(Math.log(a) / Math.LN10))
		};
		a.normalizeTickInterval = function(n, h, e, u, y) {
			var q, x = n;
			e = a.pick(e, 1);
			q = n / e;
			h || (h = y ? [1, 1.2, 1.5, 2, 2.5, 3, 4, 5, 6, 8, 10] : [1, 2, 2.5, 5, 10], !1 === u && (1 === e ? h = a.grep(h, function(a) {
				return 0 === a % 1
			}) : .1 >= e && (h = [1 / e])));
			for(u = 0; u < h.length && !(x = h[u], y && x * e >= n ||
					!y && q <= (h[u] + (h[u + 1] || h[u])) / 2); u++);
			return x = a.correctFloat(x * e, -Math.round(Math.log(.001) / Math.LN10))
		};
		a.stableSort = function(a, h) {
			var e = a.length,
				n, y;
			for(y = 0; y < e; y++) a[y].safeI = y;
			a.sort(function(a, e) {
				n = h(a, e);
				return 0 === n ? a.safeI - e.safeI : n
			});
			for(y = 0; y < e; y++) delete a[y].safeI
		};
		a.arrayMin = function(a) {
			for(var h = a.length, e = a[0]; h--;) a[h] < e && (e = a[h]);
			return e
		};
		a.arrayMax = function(a) {
			for(var h = a.length, e = a[0]; h--;) a[h] > e && (e = a[h]);
			return e
		};
		a.destroyObjectProperties = function(n, h) {
			a.objectEach(n, function(a,
				u) {
				a && a !== h && a.destroy && a.destroy();
				delete n[u]
			})
		};
		a.discardElement = function(n) {
			var h = a.garbageBin;
			h || (h = a.createElement("div"));
			n && h.appendChild(n);
			h.innerHTML = ""
		};
		a.correctFloat = function(a, h) {
			return parseFloat(a.toPrecision(h || 14))
		};
		a.setAnimation = function(n, h) {
			h.renderer.globalAnimation = a.pick(n, h.options.chart.animation, !0)
		};
		a.animObject = function(n) {
			return a.isObject(n) ? a.merge(n) : {
				duration: n ? 500 : 0
			}
		};
		a.timeUnits = {
			millisecond: 1,
			second: 1E3,
			minute: 6E4,
			hour: 36E5,
			day: 864E5,
			week: 6048E5,
			month: 24192E5,
			year: 314496E5
		};
		a.numberFormat = function(n, h, e, u) {
			n = +n || 0;
			h = +h;
			var y = a.defaultOptions.lang,
				q = (n.toString().split(".")[1] || "").split("e")[0].length,
				x, f, c = n.toString().split("e"); - 1 === h ? h = Math.min(q, 20) : a.isNumber(h) ? h && c[1] && 0 > c[1] && (x = h + +c[1], 0 <= x ? (c[0] = (+c[0]).toExponential(x).split("e")[0], h = x) : (c[0] = c[0].split(".")[0] || 0, n = 20 > h ? (c[0] * Math.pow(10, c[1])).toFixed(h) : 0, c[1] = 0)) : h = 2;
			f = (Math.abs(c[1] ? c[0] : n) + Math.pow(10, -Math.max(h, q) - 1)).toFixed(h);
			q = String(a.pInt(f));
			x = 3 < q.length ? q.length % 3 : 0;
			e = a.pick(e,
				y.decimalPoint);
			u = a.pick(u, y.thousandsSep);
			n = (0 > n ? "-" : "") + (x ? q.substr(0, x) + u : "");
			n += q.substr(x).replace(/(\d{3})(?=\d)/g, "$1" + u);
			h && (n += e + f.slice(-h));
			c[1] && 0 !== +n && (n += "e" + c[1]);
			return n
		};
		Math.easeInOutSine = function(a) {
			return -.5 * (Math.cos(Math.PI * a) - 1)
		};
		a.getStyle = function(n, h, e) {
			if("width" === h) return Math.max(0, Math.min(n.offsetWidth, n.scrollWidth) - a.getStyle(n, "padding-left") - a.getStyle(n, "padding-right"));
			if("height" === h) return Math.max(0, Math.min(n.offsetHeight, n.scrollHeight) - a.getStyle(n, "padding-top") -
				a.getStyle(n, "padding-bottom"));
			F.getComputedStyle || a.error(27, !0);
			if(n = F.getComputedStyle(n, void 0)) n = n.getPropertyValue(h), a.pick(e, "opacity" !== h) && (n = a.pInt(n));
			return n
		};
		a.inArray = function(n, h, e) {
			return(a.indexOfPolyfill || Array.prototype.indexOf).call(h, n, e)
		};
		a.grep = function(n, h) {
			return(a.filterPolyfill || Array.prototype.filter).call(n, h)
		};
		a.find = Array.prototype.find ? function(a, h) {
			return a.find(h)
		} : function(a, h) {
			var e, u = a.length;
			for(e = 0; e < u; e++)
				if(h(a[e], e)) return a[e]
		};
		a.some = function(n, h, e) {
			return(a.somePolyfill ||
				Array.prototype.some).call(n, h, e)
		};
		a.map = function(a, h) {
			for(var e = [], u = 0, y = a.length; u < y; u++) e[u] = h.call(a[u], a[u], u, a);
			return e
		};
		a.keys = function(n) {
			return(a.keysPolyfill || Object.keys).call(void 0, n)
		};
		a.reduce = function(n, h, e) {
			return(a.reducePolyfill || Array.prototype.reduce).apply(n, 2 < arguments.length ? [h, e] : [h])
		};
		a.offset = function(a) {
			var h = E.documentElement;
			a = a.parentElement || a.parentNode ? a.getBoundingClientRect() : {
				top: 0,
				left: 0
			};
			return {
				top: a.top + (F.pageYOffset || h.scrollTop) - (h.clientTop || 0),
				left: a.left +
					(F.pageXOffset || h.scrollLeft) - (h.clientLeft || 0)
			}
		};
		a.stop = function(n, h) {
			for(var e = a.timers.length; e--;) a.timers[e].elem !== n || h && h !== a.timers[e].prop || (a.timers[e].stopped = !0)
		};
		a.each = function(n, h, e) {
			return(a.forEachPolyfill || Array.prototype.forEach).call(n, h, e)
		};
		a.objectEach = function(a, h, e) {
			for(var u in a) a.hasOwnProperty(u) && h.call(e || a[u], a[u], u, a)
		};
		a.addEvent = function(n, h, e, u) {
			var y, q = n.addEventListener || a.addEventListenerPolyfill;
			y = "function" === typeof n && n.prototype ? n.prototype.protoEvents = n.prototype.protoEvents || {} : n.hcEvents = n.hcEvents || {};
			a.Point && n instanceof a.Point && n.series && n.series.chart && (n.series.chart.runTrackerClick = !0);
			q && q.call(n, h, e, !1);
			y[h] || (y[h] = []);
			y[h].push(e);
			u && a.isNumber(u.order) && (e.order = u.order, y[h].sort(function(a, f) {
				return a.order - f.order
			}));
			return function() {
				a.removeEvent(n, h, e)
			}
		};
		a.removeEvent = function(n, h, e) {
			function u(f, c) {
				var k = n.removeEventListener || a.removeEventListenerPolyfill;
				k && k.call(n, f, c, !1)
			}

			function y(f) {
				var c, k;
				n.nodeName && (h ? (c = {}, c[h] = !0) : c = f, a.objectEach(c, function(a,
					c) {
					if(f[c])
						for(k = f[c].length; k--;) u(c, f[c][k])
				}))
			}
			var q, x;
			a.each(["protoEvents", "hcEvents"], function(f) {
				var c = n[f];
				c && (h ? (q = c[h] || [], e ? (x = a.inArray(e, q), -1 < x && (q.splice(x, 1), c[h] = q), u(h, e)) : (y(c), c[h] = [])) : (y(c), n[f] = {}))
			})
		};
		a.fireEvent = function(n, h, e, u) {
			var y, q, x, f, c;
			e = e || {};
			E.createEvent && (n.dispatchEvent || n.fireEvent) ? (y = E.createEvent("Events"), y.initEvent(h, !0, !0), a.extend(y, e), n.dispatchEvent ? n.dispatchEvent(y) : n.fireEvent(h, y)) : a.each(["protoEvents", "hcEvents"], function(k) {
				if(n[k])
					for(q = n[k][h] || [], x = q.length, e.target || a.extend(e, {
							preventDefault: function() {
								e.defaultPrevented = !0
							},
							target: n,
							type: h
						}), f = 0; f < x; f++)(c = q[f]) && !1 === c.call(n, e) && e.preventDefault()
			});
			u && !e.defaultPrevented && u.call(n, e)
		};
		a.animate = function(n, h, e) {
			var u, y = "",
				q, x, f;
			a.isObject(e) || (f = arguments, e = {
				duration: f[2],
				easing: f[3],
				complete: f[4]
			});
			a.isNumber(e.duration) || (e.duration = 400);
			e.easing = "function" === typeof e.easing ? e.easing : Math[e.easing] || Math.easeInOutSine;
			e.curAnim = a.merge(h);
			a.objectEach(h, function(c, f) {
				a.stop(n, f);
				x = new a.Fx(n, e, f);
				q = null;
				"d" === f ? (x.paths = x.initPath(n, n.d, h.d), x.toD = h.d, u = 0, q = 1) : n.attr ? u = n.attr(f) : (u = parseFloat(a.getStyle(n, f)) || 0, "opacity" !== f && (y = "px"));
				q || (q = c);
				q && q.match && q.match("px") && (q = q.replace(/px/g, ""));
				x.run(u, q, y)
			})
		};
		a.seriesType = function(n, h, e, u, y) {
			var q = a.getOptions(),
				x = a.seriesTypes;
			q.plotOptions[n] = a.merge(q.plotOptions[h], e);
			x[n] = a.extendClass(x[h] || function() {}, u);
			x[n].prototype.type = n;
			y && (x[n].prototype.pointClass = a.extendClass(a.Point, y));
			return x[n]
		};
		a.uniqueKey = function() {
			var a =
				Math.random().toString(36).substring(2, 9),
				h = 0;
			return function() {
				return "highcharts-" + a + "-" + h++
			}
		}();
		F.jQuery && (F.jQuery.fn.highcharts = function() {
			var n = [].slice.call(arguments);
			if(this[0]) return n[0] ? (new(a[a.isString(n[0]) ? n.shift() : "Chart"])(this[0], n[0], n[1]), this) : C[a.attr(this[0], "data-highcharts-chart")]
		})
	})(K);
	(function(a) {
		var C = a.each,
			E = a.isNumber,
			F = a.map,
			n = a.merge,
			h = a.pInt;
		a.Color = function(e) {
			if(!(this instanceof a.Color)) return new a.Color(e);
			this.init(e)
		};
		a.Color.prototype = {
			parsers: [{
				regex: /rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]?(?:\.[0-9]+)?)\s*\)/,
				parse: function(a) {
					return [h(a[1]), h(a[2]), h(a[3]), parseFloat(a[4], 10)]
				}
			}, {
				regex: /rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/,
				parse: function(a) {
					return [h(a[1]), h(a[2]), h(a[3]), 1]
				}
			}],
			names: {
				none: "rgba(255,255,255,0)",
				white: "#ffffff",
				black: "#000000"
			},
			init: function(e) {
				var h, y, q, x;
				if((this.input = e = this.names[e && e.toLowerCase ? e.toLowerCase() : ""] || e) && e.stops) this.stops = F(e.stops, function(f) {
					return new a.Color(f[1])
				});
				else if(e && e.charAt && "#" === e.charAt() && (h = e.length, e = parseInt(e.substr(1),
						16), 7 === h ? y = [(e & 16711680) >> 16, (e & 65280) >> 8, e & 255, 1] : 4 === h && (y = [(e & 3840) >> 4 | (e & 3840) >> 8, (e & 240) >> 4 | e & 240, (e & 15) << 4 | e & 15, 1])), !y)
					for(q = this.parsers.length; q-- && !y;) x = this.parsers[q], (h = x.regex.exec(e)) && (y = x.parse(h));
				this.rgba = y || []
			},
			get: function(a) {
				var e = this.input,
					h = this.rgba,
					q;
				this.stops ? (q = n(e), q.stops = [].concat(q.stops), C(this.stops, function(e, f) {
					q.stops[f] = [q.stops[f][0], e.get(a)]
				})) : q = h && E(h[0]) ? "rgb" === a || !a && 1 === h[3] ? "rgb(" + h[0] + "," + h[1] + "," + h[2] + ")" : "a" === a ? h[3] : "rgba(" + h.join(",") + ")" : e;
				return q
			},
			brighten: function(a) {
				var e, y = this.rgba;
				if(this.stops) C(this.stops, function(e) {
					e.brighten(a)
				});
				else if(E(a) && 0 !== a)
					for(e = 0; 3 > e; e++) y[e] += h(255 * a), 0 > y[e] && (y[e] = 0), 255 < y[e] && (y[e] = 255);
				return this
			},
			setOpacity: function(a) {
				this.rgba[3] = a;
				return this
			},
			tweenTo: function(a, h) {
				var e = this.rgba,
					q = a.rgba;
				q.length && e && e.length ? (a = 1 !== q[3] || 1 !== e[3], h = (a ? "rgba(" : "rgb(") + Math.round(q[0] + (e[0] - q[0]) * (1 - h)) + "," + Math.round(q[1] + (e[1] - q[1]) * (1 - h)) + "," + Math.round(q[2] + (e[2] - q[2]) * (1 - h)) + (a ? "," + (q[3] + (e[3] -
					q[3]) * (1 - h)) : "") + ")") : h = a.input || "none";
				return h
			}
		};
		a.color = function(e) {
			return new a.Color(e)
		}
	})(K);
	(function(a) {
		var C, E, F = a.addEvent,
			n = a.animate,
			h = a.attr,
			e = a.charts,
			u = a.color,
			y = a.css,
			q = a.createElement,
			x = a.defined,
			f = a.deg2rad,
			c = a.destroyObjectProperties,
			k = a.doc,
			r = a.each,
			l = a.extend,
			d = a.erase,
			b = a.grep,
			v = a.hasTouch,
			p = a.inArray,
			I = a.isArray,
			t = a.isFirefox,
			L = a.isMS,
			A = a.isObject,
			H = a.isString,
			m = a.isWebKit,
			D = a.merge,
			B = a.noop,
			M = a.objectEach,
			G = a.pick,
			g = a.pInt,
			w = a.removeEvent,
			P = a.stop,
			Q = a.svg,
			J = a.SVG_NS,
			O = a.symbolSizes,
			N = a.win;
		C = a.SVGElement = function() {
			return this
		};
		l(C.prototype, {
			opacity: 1,
			SVG_NS: J,
			textProps: "direction fontSize fontWeight fontFamily fontStyle color lineHeight width textAlign textDecoration textOverflow textOutline".split(" "),
			init: function(a, g) {
				this.element = "span" === g ? q(g) : k.createElementNS(this.SVG_NS, g);
				this.renderer = a
			},
			animate: function(z, g, b) {
				g = a.animObject(G(g, this.renderer.globalAnimation, !0));
				0 !== g.duration ? (b && (g.complete = b), n(this, z, g)) : (this.attr(z, null, b), g.step && g.step.call(this));
				return this
			},
			complexColor: function(z, g, b) {
				var d = this.renderer,
					w, c, l, J, f, m, B, k, R, v, p, t = [],
					A;
				a.fireEvent(this.renderer, "complexColor", {
					args: arguments
				}, function() {
					z.radialGradient ? c = "radialGradient" : z.linearGradient && (c = "linearGradient");
					c && (l = z[c], f = d.gradients, B = z.stops, v = b.radialReference, I(l) && (z[c] = l = {
						x1: l[0],
						y1: l[1],
						x2: l[2],
						y2: l[3],
						gradientUnits: "userSpaceOnUse"
					}), "radialGradient" === c && v && !x(l.gradientUnits) && (J = l, l = D(l, d.getRadialAttr(v, J), {
						gradientUnits: "userSpaceOnUse"
					})), M(l, function(a, z) {
						"id" !== z && t.push(z,
							a)
					}), M(B, function(a) {
						t.push(a)
					}), t = t.join(","), f[t] ? p = f[t].attr("id") : (l.id = p = a.uniqueKey(), f[t] = m = d.createElement(c).attr(l).add(d.defs), m.radAttr = J, m.stops = [], r(B, function(z) {
						0 === z[1].indexOf("rgba") ? (w = a.color(z[1]), k = w.get("rgb"), R = w.get("a")) : (k = z[1], R = 1);
						z = d.createElement("stop").attr({
							offset: z[0],
							"stop-color": k,
							"stop-opacity": R
						}).add(m);
						m.stops.push(z)
					})), A = "url(" + d.url + "#" + p + ")", b.setAttribute(g, A), b.gradient = t, z.toString = function() {
						return A
					})
				})
			},
			applyTextOutline: function(z) {
				var g = this.element,
					b, w, c, l, m; - 1 !== z.indexOf("contrast") && (z = z.replace(/contrast/g, this.renderer.getContrast(g.style.fill)));
				z = z.split(" ");
				w = z[z.length - 1];
				if((c = z[0]) && "none" !== c && a.svg) {
					this.fakeTS = !0;
					z = [].slice.call(g.getElementsByTagName("tspan"));
					this.ySetter = this.xSetter;
					c = c.replace(/(^[\d\.]+)(.*?)$/g, function(a, z, g) {
						return 2 * z + g
					});
					for(m = z.length; m--;) b = z[m], "highcharts-text-outline" === b.getAttribute("class") && d(z, g.removeChild(b));
					l = g.firstChild;
					r(z, function(a, z) {
						0 === z && (a.setAttribute("x", g.getAttribute("x")),
							z = g.getAttribute("y"), a.setAttribute("y", z || 0), null === z && g.setAttribute("y", 0));
						a = a.cloneNode(1);
						h(a, {
							"class": "highcharts-text-outline",
							fill: w,
							stroke: w,
							"stroke-width": c,
							"stroke-linejoin": "round"
						});
						g.insertBefore(a, l)
					})
				}
			},
			attr: function(a, g, b, d) {
				var z, w = this.element,
					c, l = this,
					m, f;
				"string" === typeof a && void 0 !== g && (z = a, a = {}, a[z] = g);
				"string" === typeof a ? l = (this[a + "Getter"] || this._defaultGetter).call(this, a, w) : (M(a, function(z, g) {
					m = !1;
					d || P(this, g);
					this.symbolName && /^(x|y|width|height|r|start|end|innerR|anchorX|anchorY)$/.test(g) &&
						(c || (this.symbolAttr(a), c = !0), m = !0);
					!this.rotation || "x" !== g && "y" !== g || (this.doTransform = !0);
					m || (f = this[g + "Setter"] || this._defaultSetter, f.call(this, z, g, w), this.shadows && /^(width|height|visibility|x|y|d|transform|cx|cy|r)$/.test(g) && this.updateShadows(g, z, f))
				}, this), this.afterSetters());
				b && b.call(this);
				return l
			},
			afterSetters: function() {
				this.doTransform && (this.updateTransform(), this.doTransform = !1)
			},
			updateShadows: function(a, g, b) {
				for(var z = this.shadows, d = z.length; d--;) b.call(z[d], "height" === a ? Math.max(g -
					(z[d].cutHeight || 0), 0) : "d" === a ? this.d : g, a, z[d])
			},
			addClass: function(a, g) {
				var z = this.attr("class") || ""; - 1 === z.indexOf(a) && (g || (a = (z + (z ? " " : "") + a).replace("  ", " ")), this.attr("class", a));
				return this
			},
			hasClass: function(a) {
				return -1 !== p(a, (this.attr("class") || "").split(" "))
			},
			removeClass: function(a) {
				return this.attr("class", (this.attr("class") || "").replace(a, ""))
			},
			symbolAttr: function(a) {
				var z = this;
				r("x y r start end width height innerR anchorX anchorY".split(" "), function(g) {
					z[g] = G(a[g], z[g])
				});
				z.attr({
					d: z.renderer.symbols[z.symbolName](z.x,
						z.y, z.width, z.height, z)
				})
			},
			clip: function(a) {
				return this.attr("clip-path", a ? "url(" + this.renderer.url + "#" + a.id + ")" : "none")
			},
			crisp: function(a, g) {
				var z;
				g = g || a.strokeWidth || 0;
				z = Math.round(g) % 2 / 2;
				a.x = Math.floor(a.x || this.x || 0) + z;
				a.y = Math.floor(a.y || this.y || 0) + z;
				a.width = Math.floor((a.width || this.width || 0) - 2 * z);
				a.height = Math.floor((a.height || this.height || 0) - 2 * z);
				x(a.strokeWidth) && (a.strokeWidth = g);
				return a
			},
			css: function(a) {
				var z = this.styles,
					b = {},
					d = this.element,
					w, c = "",
					m, f = !z,
					J = ["textOutline", "textOverflow",
						"width"
					];
				a && a.color && (a.fill = a.color);
				z && M(a, function(a, g) {
					a !== z[g] && (b[g] = a, f = !0)
				});
				f && (z && (a = l(z, b)), a && (null === a.width || "auto" === a.width ? delete this.textWidth : "text" === d.nodeName.toLowerCase() && a.width && (w = this.textWidth = g(a.width))), this.styles = a, w && !Q && this.renderer.forExport && delete a.width, d.namespaceURI === this.SVG_NS ? (m = function(a, z) {
					return "-" + z.toLowerCase()
				}, M(a, function(a, z) {
					-1 === p(z, J) && (c += z.replace(/([A-Z])/g, m) + ":" + a + ";")
				}), c && h(d, "style", c)) : y(d, a), this.added && ("text" === this.element.nodeName &&
					this.renderer.buildText(this), a && a.textOutline && this.applyTextOutline(a.textOutline)));
				return this
			},
			strokeWidth: function() {
				return this["stroke-width"] || 0
			},
			on: function(a, g) {
				var z = this,
					b = z.element;
				v && "click" === a ? (b.ontouchstart = function(a) {
					z.touchEventFired = Date.now();
					a.preventDefault();
					g.call(b, a)
				}, b.onclick = function(a) {
					(-1 === N.navigator.userAgent.indexOf("Android") || 1100 < Date.now() - (z.touchEventFired || 0)) && g.call(b, a)
				}) : b["on" + a] = g;
				return this
			},
			setRadialReference: function(a) {
				var z = this.renderer.gradients[this.element.gradient];
				this.element.radialReference = a;
				z && z.radAttr && z.animate(this.renderer.getRadialAttr(a, z.radAttr));
				return this
			},
			translate: function(a, g) {
				return this.attr({
					translateX: a,
					translateY: g
				})
			},
			invert: function(a) {
				this.inverted = a;
				this.updateTransform();
				return this
			},
			updateTransform: function() {
				var a = this.translateX || 0,
					g = this.translateY || 0,
					b = this.scaleX,
					d = this.scaleY,
					w = this.inverted,
					c = this.rotation,
					l = this.matrix,
					m = this.element;
				w && (a += this.width, g += this.height);
				a = ["translate(" + a + "," + g + ")"];
				x(l) && a.push("matrix(" + l.join(",") +
					")");
				w ? a.push("rotate(90) scale(-1,1)") : c && a.push("rotate(" + c + " " + G(this.rotationOriginX, m.getAttribute("x"), 0) + " " + G(this.rotationOriginY, m.getAttribute("y") || 0) + ")");
				(x(b) || x(d)) && a.push("scale(" + G(b, 1) + " " + G(d, 1) + ")");
				a.length && m.setAttribute("transform", a.join(" "))
			},
			toFront: function() {
				var a = this.element;
				a.parentNode.appendChild(a);
				return this
			},
			align: function(a, g, b) {
				var z, w, c, l, m = {};
				w = this.renderer;
				c = w.alignedObjects;
				var f, J;
				if(a) {
					if(this.alignOptions = a, this.alignByTranslate = g, !b || H(b)) this.alignTo =
						z = b || "renderer", d(c, this), c.push(this), b = null
				} else a = this.alignOptions, g = this.alignByTranslate, z = this.alignTo;
				b = G(b, w[z], w);
				z = a.align;
				w = a.verticalAlign;
				c = (b.x || 0) + (a.x || 0);
				l = (b.y || 0) + (a.y || 0);
				"right" === z ? f = 1 : "center" === z && (f = 2);
				f && (c += (b.width - (a.width || 0)) / f);
				m[g ? "translateX" : "x"] = Math.round(c);
				"bottom" === w ? J = 1 : "middle" === w && (J = 2);
				J && (l += (b.height - (a.height || 0)) / J);
				m[g ? "translateY" : "y"] = Math.round(l);
				this[this.placed ? "animate" : "attr"](m);
				this.placed = !0;
				this.alignAttr = m;
				return this
			},
			getBBox: function(a,
				g) {
				var z, b = this.renderer,
					d, w = this.element,
					c = this.styles,
					m, J = this.textStr,
					B, k = b.cache,
					v = b.cacheKeys,
					p;
				g = G(g, this.rotation);
				d = g * f;
				m = c && c.fontSize;
				x(J) && (p = J.toString(), -1 === p.indexOf("\x3c") && (p = p.replace(/[0-9]/g, "0")), p += ["", g || 0, m, this.textWidth, c && c.textOverflow].join());
				p && !a && (z = k[p]);
				if(!z) {
					if(w.namespaceURI === this.SVG_NS || b.forExport) {
						try {
							(B = this.fakeTS && function(a) {
								r(w.querySelectorAll(".highcharts-text-outline"), function(z) {
									z.style.display = a
								})
							}) && B("none"), z = w.getBBox ? l({}, w.getBBox()) : {
								width: w.offsetWidth,
								height: w.offsetHeight
							}, B && B("")
						} catch(W) {}
						if(!z || 0 > z.width) z = {
							width: 0,
							height: 0
						}
					} else z = this.htmlGetBBox();
					b.isSVG && (a = z.width, b = z.height, c && "11px" === c.fontSize && 17 === Math.round(b) && (z.height = b = 14), g && (z.width = Math.abs(b * Math.sin(d)) + Math.abs(a * Math.cos(d)), z.height = Math.abs(b * Math.cos(d)) + Math.abs(a * Math.sin(d))));
					if(p && 0 < z.height) {
						for(; 250 < v.length;) delete k[v.shift()];
						k[p] || v.push(p);
						k[p] = z
					}
				}
				return z
			},
			show: function(a) {
				return this.attr({
					visibility: a ? "inherit" : "visible"
				})
			},
			hide: function() {
				return this.attr({
					visibility: "hidden"
				})
			},
			fadeOut: function(a) {
				var z = this;
				z.animate({
					opacity: 0
				}, {
					duration: a || 150,
					complete: function() {
						z.attr({
							y: -9999
						})
					}
				})
			},
			add: function(a) {
				var z = this.renderer,
					g = this.element,
					b;
				a && (this.parentGroup = a);
				this.parentInverted = a && a.inverted;
				void 0 !== this.textStr && z.buildText(this);
				this.added = !0;
				if(!a || a.handleZ || this.zIndex) b = this.zIndexSetter();
				b || (a ? a.element : z.box).appendChild(g);
				if(this.onAdd) this.onAdd();
				return this
			},
			safeRemoveChild: function(a) {
				var z = a.parentNode;
				z && z.removeChild(a)
			},
			destroy: function() {
				var a =
					this,
					g = a.element || {},
					b = a.renderer.isSVG && "SPAN" === g.nodeName && a.parentGroup,
					w = g.ownerSVGElement,
					c = a.clipPath;
				g.onclick = g.onmouseout = g.onmouseover = g.onmousemove = g.point = null;
				P(a);
				c && w && (r(w.querySelectorAll("[clip-path],[CLIP-PATH]"), function(a) {
					var g = a.getAttribute("clip-path"),
						z = c.element.id;
					(-1 < g.indexOf("(#" + z + ")") || -1 < g.indexOf('("#' + z + '")')) && a.removeAttribute("clip-path")
				}), a.clipPath = c.destroy());
				if(a.stops) {
					for(w = 0; w < a.stops.length; w++) a.stops[w] = a.stops[w].destroy();
					a.stops = null
				}
				a.safeRemoveChild(g);
				for(a.destroyShadows(); b && b.div && 0 === b.div.childNodes.length;) g = b.parentGroup, a.safeRemoveChild(b.div), delete b.div, b = g;
				a.alignTo && d(a.renderer.alignedObjects, a);
				M(a, function(g, z) {
					delete a[z]
				});
				return null
			},
			shadow: function(a, g, b) {
				var z = [],
					d, w, c = this.element,
					l, m, f, J;
				if(!a) this.destroyShadows();
				else if(!this.shadows) {
					m = G(a.width, 3);
					f = (a.opacity || .15) / m;
					J = this.parentInverted ? "(-1,-1)" : "(" + G(a.offsetX, 1) + ", " + G(a.offsetY, 1) + ")";
					for(d = 1; d <= m; d++) w = c.cloneNode(0), l = 2 * m + 1 - 2 * d, h(w, {
						isShadow: "true",
						stroke: a.color ||
							"#000000",
						"stroke-opacity": f * d,
						"stroke-width": l,
						transform: "translate" + J,
						fill: "none"
					}), b && (h(w, "height", Math.max(h(w, "height") - l, 0)), w.cutHeight = l), g ? g.element.appendChild(w) : c.parentNode && c.parentNode.insertBefore(w, c), z.push(w);
					this.shadows = z
				}
				return this
			},
			destroyShadows: function() {
				r(this.shadows || [], function(a) {
					this.safeRemoveChild(a)
				}, this);
				this.shadows = void 0
			},
			xGetter: function(a) {
				"circle" === this.element.nodeName && ("x" === a ? a = "cx" : "y" === a && (a = "cy"));
				return this._defaultGetter(a)
			},
			_defaultGetter: function(a) {
				a =
					G(this[a + "Value"], this[a], this.element ? this.element.getAttribute(a) : null, 0);
				/^[\-0-9\.]+$/.test(a) && (a = parseFloat(a));
				return a
			},
			dSetter: function(a, g, b) {
				a && a.join && (a = a.join(" "));
				/(NaN| {2}|^$)/.test(a) && (a = "M 0 0");
				this[g] !== a && (b.setAttribute(g, a), this[g] = a)
			},
			dashstyleSetter: function(a) {
				var b, z = this["stroke-width"];
				"inherit" === z && (z = 1);
				if(a = a && a.toLowerCase()) {
					a = a.replace("shortdashdotdot", "3,1,1,1,1,1,").replace("shortdashdot", "3,1,1,1").replace("shortdot", "1,1,").replace("shortdash", "3,1,").replace("longdash",
						"8,3,").replace(/dot/g, "1,3,").replace("dash", "4,3,").replace(/,$/, "").split(",");
					for(b = a.length; b--;) a[b] = g(a[b]) * z;
					a = a.join(",").replace(/NaN/g, "none");
					this.element.setAttribute("stroke-dasharray", a)
				}
			},
			alignSetter: function(a) {
				this.alignValue = a;
				this.element.setAttribute("text-anchor", {
					left: "start",
					center: "middle",
					right: "end"
				}[a])
			},
			opacitySetter: function(a, g, b) {
				this[g] = a;
				b.setAttribute(g, a)
			},
			titleSetter: function(a) {
				var g = this.element.getElementsByTagName("title")[0];
				g || (g = k.createElementNS(this.SVG_NS,
					"title"), this.element.appendChild(g));
				g.firstChild && g.removeChild(g.firstChild);
				g.appendChild(k.createTextNode(String(G(a), "").replace(/<[^>]*>/g, "").replace(/&lt;/g, "\x3c").replace(/&gt;/g, "\x3e")))
			},
			textSetter: function(a) {
				a !== this.textStr && (delete this.bBox, this.textStr = a, this.added && this.renderer.buildText(this))
			},
			fillSetter: function(a, g, b) {
				"string" === typeof a ? b.setAttribute(g, a) : a && this.complexColor(a, g, b)
			},
			visibilitySetter: function(a, g, b) {
				"inherit" === a ? b.removeAttribute(g) : this[g] !== a && b.setAttribute(g,
					a);
				this[g] = a
			},
			zIndexSetter: function(a, b) {
				var d = this.renderer,
					w = this.parentGroup,
					z = (w || d).element || d.box,
					c, l = this.element,
					m, f, d = z === d.box;
				c = this.added;
				var J;
				x(a) ? (l.setAttribute("data-z-index", a), a = +a, this[b] === a && (c = !1)) : x(this[b]) && l.removeAttribute("data-z-index");
				this[b] = a;
				if(c) {
					(a = this.zIndex) && w && (w.handleZ = !0);
					b = z.childNodes;
					for(J = b.length - 1; 0 <= J && !m; J--)
						if(w = b[J], c = w.getAttribute("data-z-index"), f = !x(c), w !== l)
							if(0 > a && f && !d && !J) z.insertBefore(l, b[J]), m = !0;
							else if(g(c) <= a || f && (!x(a) || 0 <= a)) z.insertBefore(l,
						b[J + 1] || null), m = !0;
					m || (z.insertBefore(l, b[d ? 3 : 0] || null), m = !0)
				}
				return m
			},
			_defaultSetter: function(a, g, b) {
				b.setAttribute(g, a)
			}
		});
		C.prototype.yGetter = C.prototype.xGetter;
		C.prototype.translateXSetter = C.prototype.translateYSetter = C.prototype.rotationSetter = C.prototype.verticalAlignSetter = C.prototype.rotationOriginXSetter = C.prototype.rotationOriginYSetter = C.prototype.scaleXSetter = C.prototype.scaleYSetter = C.prototype.matrixSetter = function(a, g) {
			this[g] = a;
			this.doTransform = !0
		};
		C.prototype["stroke-widthSetter"] =
			C.prototype.strokeSetter = function(a, g, b) {
				this[g] = a;
				this.stroke && this["stroke-width"] ? (C.prototype.fillSetter.call(this, this.stroke, "stroke", b), b.setAttribute("stroke-width", this["stroke-width"]), this.hasStroke = !0) : "stroke-width" === g && 0 === a && this.hasStroke && (b.removeAttribute("stroke"), this.hasStroke = !1)
			};
		E = a.SVGRenderer = function() {
			this.init.apply(this, arguments)
		};
		l(E.prototype, {
			Element: C,
			SVG_NS: J,
			init: function(a, g, b, d, w, c) {
				var z;
				d = this.createElement("svg").attr({
					version: "1.1",
					"class": "highcharts-root"
				}).css(this.getStyle(d));
				z = d.element;
				a.appendChild(z);
				h(a, "dir", "ltr"); - 1 === a.innerHTML.indexOf("xmlns") && h(z, "xmlns", this.SVG_NS);
				this.isSVG = !0;
				this.box = z;
				this.boxWrapper = d;
				this.alignedObjects = [];
				this.url = (t || m) && k.getElementsByTagName("base").length ? N.location.href.replace(/#.*?$/, "").replace(/<[^>]*>/g, "").replace(/([\('\)])/g, "\\$1").replace(/ /g, "%20") : "";
				this.createElement("desc").add().element.appendChild(k.createTextNode("Created with Highcharts 6.1.1"));
				this.defs = this.createElement("defs").add();
				this.allowHTML = c;
				this.forExport = w;
				this.gradients = {};
				this.cache = {};
				this.cacheKeys = [];
				this.imgCount = 0;
				this.setSize(g, b, !1);
				var l;
				t && a.getBoundingClientRect && (g = function() {
					y(a, {
						left: 0,
						top: 0
					});
					l = a.getBoundingClientRect();
					y(a, {
						left: Math.ceil(l.left) - l.left + "px",
						top: Math.ceil(l.top) - l.top + "px"
					})
				}, g(), this.unSubPixelFix = F(N, "resize", g))
			},
			getStyle: function(a) {
				return this.style = l({
					fontFamily: '"Lucida Grande", "Lucida Sans Unicode", Arial, Helvetica, sans-serif',
					fontSize: "12px"
				}, a)
			},
			setStyle: function(a) {
				this.boxWrapper.css(this.getStyle(a))
			},
			isHidden: function() {
				return !this.boxWrapper.getBBox().width
			},
			destroy: function() {
				var a = this.defs;
				this.box = null;
				this.boxWrapper = this.boxWrapper.destroy();
				c(this.gradients || {});
				this.gradients = null;
				a && (this.defs = a.destroy());
				this.unSubPixelFix && this.unSubPixelFix();
				return this.alignedObjects = null
			},
			createElement: function(a) {
				var g = new this.Element;
				g.init(this, a);
				return g
			},
			draw: B,
			getRadialAttr: function(a, g) {
				return {
					cx: a[0] - a[2] / 2 + g.cx * a[2],
					cy: a[1] - a[2] / 2 + g.cy * a[2],
					r: g.r * a[2]
				}
			},
			getSpanWidth: function(a) {
				return a.getBBox(!0).width
			},
			applyEllipsis: function(a, g, b, d) {
				var w = a.rotation,
					c = b,
					z, l = 0,
					m = b.length,
					J = function(a) {
						g.removeChild(g.firstChild);
						a && g.appendChild(k.createTextNode(a))
					},
					f;
				a.rotation = 0;
				c = this.getSpanWidth(a, g);
				if(f = c > d) {
					for(; l <= m;) z = Math.ceil((l + m) / 2), c = b.substring(0, z) + "\u2026", J(c), c = this.getSpanWidth(a, g), l === m ? l = m + 1 : c > d ? m = z - 1 : l = z;
					0 === m && J("")
				}
				a.rotation = w;
				return f
			},
			escapes: {
				"\x26": "\x26amp;",
				"\x3c": "\x26lt;",
				"\x3e": "\x26gt;",
				"'": "\x26#39;",
				'"': "\x26quot;"
			},
			buildText: function(a) {
				var d = a.element,
					w = this,
					c = w.forExport,
					l = G(a.textStr, "").toString(),
					z = -1 !== l.indexOf("\x3c"),
					m = d.childNodes,
					f, B = h(d, "x"),
					v = a.styles,
					D = a.textWidth,
					t = v && v.lineHeight,
					A = v && v.textOutline,
					e = v && "ellipsis" === v.textOverflow,
					P = v && "nowrap" === v.whiteSpace,
					O = v && v.fontSize,
					q, x, I = m.length,
					v = D && !a.added && this.box,
					H = function(a) {
						var b;
						b = /(px|em)$/.test(a && a.style.fontSize) ? a.style.fontSize : O || w.style.fontSize || 12;
						return t ? g(t) : w.fontMetrics(b, a.getAttribute("style") ? a : d).h
					},
					N = function(a, g) {
						M(w.escapes, function(b, d) {
							g && -1 !== p(b, g) || (a = a.toString().replace(new RegExp(b,
								"g"), d))
						});
						return a
					},
					u = function(a, g) {
						var b;
						b = a.indexOf("\x3c");
						a = a.substring(b, a.indexOf("\x3e") - b);
						b = a.indexOf(g + "\x3d");
						if(-1 !== b && (b = b + g.length + 1, g = a.charAt(b), '"' === g || "'" === g)) return a = a.substring(b + 1), a.substring(0, a.indexOf(g))
					};
				q = [l, e, P, t, A, O, D].join();
				if(q !== a.textCache) {
					for(a.textCache = q; I--;) d.removeChild(m[I]);
					z || A || e || D || -1 !== l.indexOf(" ") ? (v && v.appendChild(d), l = z ? l.replace(/<(b|strong)>/g, '\x3cspan style\x3d"font-weight:bold"\x3e').replace(/<(i|em)>/g, '\x3cspan style\x3d"font-style:italic"\x3e').replace(/<a/g,
						"\x3cspan").replace(/<\/(b|strong|i|em|a)>/g, "\x3c/span\x3e").split(/<br.*?>/g) : [l], l = b(l, function(a) {
						return "" !== a
					}), r(l, function(g, b) {
						var l, z = 0;
						g = g.replace(/^\s+|\s+$/g, "").replace(/<span/g, "|||\x3cspan").replace(/<\/span>/g, "\x3c/span\x3e|||");
						l = g.split("|||");
						r(l, function(g) {
							if("" !== g || 1 === l.length) {
								var m = {},
									v = k.createElementNS(w.SVG_NS, "tspan"),
									p, r;
								(p = u(g, "class")) && h(v, "class", p);
								if(p = u(g, "style")) p = p.replace(/(;| |^)color([ :])/, "$1fill$2"), h(v, "style", p);
								(r = u(g, "href")) && !c && (h(v, "onclick",
									'location.href\x3d"' + r + '"'), h(v, "class", "highcharts-anchor"), y(v, {
									cursor: "pointer"
								}));
								g = N(g.replace(/<[a-zA-Z\/](.|\n)*?>/g, "") || " ");
								if(" " !== g) {
									v.appendChild(k.createTextNode(g));
									z ? m.dx = 0 : b && null !== B && (m.x = B);
									h(v, m);
									d.appendChild(v);
									!z && x && (!Q && c && y(v, {
										display: "block"
									}), h(v, "dy", H(v)));
									if(D) {
										m = g.replace(/([^\^])-/g, "$1- ").split(" ");
										r = 1 < l.length || b || 1 < m.length && !P;
										var t = [],
											A, O = H(v),
											q = a.rotation;
										for(e && (f = w.applyEllipsis(a, v, g, D)); !e && r && (m.length || t.length);) a.rotation = 0, A = w.getSpanWidth(a, v),
											g = A > D, void 0 === f && (f = g), g && 1 !== m.length ? (v.removeChild(v.firstChild), t.unshift(m.pop())) : (m = t, t = [], m.length && !P && (v = k.createElementNS(J, "tspan"), h(v, {
												dy: O,
												x: B
											}), p && h(v, "style", p), d.appendChild(v)), A > D && (D = A + 1)), m.length && v.appendChild(k.createTextNode(m.join(" ").replace(/- /g, "-")));
										a.rotation = q
									}
									z++
								}
							}
						});
						x = x || d.childNodes.length
					}), e && f && a.attr("title", N(a.textStr, ["\x26lt;", "\x26gt;"])), v && v.removeChild(d), A && a.applyTextOutline && a.applyTextOutline(A)) : d.appendChild(k.createTextNode(N(l)))
				}
			},
			getContrast: function(a) {
				a =
					u(a).rgba;
				return 510 < a[0] + a[1] + a[2] ? "#000000" : "#FFFFFF"
			},
			button: function(a, g, b, d, w, c, m, f, J) {
				var z = this.label(a, g, b, J, null, null, null, null, "button"),
					v = 0;
				z.attr(D({
					padding: 8,
					r: 2
				}, w));
				var B, k, p, r;
				w = D({
					fill: "#f7f7f7",
					stroke: "#cccccc",
					"stroke-width": 1,
					style: {
						color: "#333333",
						cursor: "pointer",
						fontWeight: "normal"
					}
				}, w);
				B = w.style;
				delete w.style;
				c = D(w, {
					fill: "#e6e6e6"
				}, c);
				k = c.style;
				delete c.style;
				m = D(w, {
					fill: "#e6ebf5",
					style: {
						color: "#000000",
						fontWeight: "bold"
					}
				}, m);
				p = m.style;
				delete m.style;
				f = D(w, {
						style: {
							color: "#cccccc"
						}
					},
					f);
				r = f.style;
				delete f.style;
				F(z.element, L ? "mouseover" : "mouseenter", function() {
					3 !== v && z.setState(1)
				});
				F(z.element, L ? "mouseout" : "mouseleave", function() {
					3 !== v && z.setState(v)
				});
				z.setState = function(a) {
					1 !== a && (z.state = v = a);
					z.removeClass(/highcharts-button-(normal|hover|pressed|disabled)/).addClass("highcharts-button-" + ["normal", "hover", "pressed", "disabled"][a || 0]);
					z.attr([w, c, m, f][a || 0]).css([B, k, p, r][a || 0])
				};
				z.attr(w).css(l({
					cursor: "default"
				}, B));
				return z.on("click", function(a) {
					3 !== v && d.call(z, a)
				})
			},
			crispLine: function(a,
				g) {
				a[1] === a[4] && (a[1] = a[4] = Math.round(a[1]) - g % 2 / 2);
				a[2] === a[5] && (a[2] = a[5] = Math.round(a[2]) + g % 2 / 2);
				return a
			},
			path: function(a) {
				var g = {
					fill: "none"
				};
				I(a) ? g.d = a : A(a) && l(g, a);
				return this.createElement("path").attr(g)
			},
			circle: function(a, g, b) {
				a = A(a) ? a : {
					x: a,
					y: g,
					r: b
				};
				g = this.createElement("circle");
				g.xSetter = g.ySetter = function(a, g, b) {
					b.setAttribute("c" + g, a)
				};
				return g.attr(a)
			},
			arc: function(a, g, b, d, w, c) {
				A(a) ? (d = a, g = d.y, b = d.r, a = d.x) : d = {
					innerR: d,
					start: w,
					end: c
				};
				a = this.symbol("arc", a, g, b, b, d);
				a.r = b;
				return a
			},
			rect: function(a,
				g, b, d, w, c) {
				w = A(a) ? a.r : w;
				var l = this.createElement("rect");
				a = A(a) ? a : void 0 === a ? {} : {
					x: a,
					y: g,
					width: Math.max(b, 0),
					height: Math.max(d, 0)
				};
				void 0 !== c && (a.strokeWidth = c, a = l.crisp(a));
				a.fill = "none";
				w && (a.r = w);
				l.rSetter = function(a, g, b) {
					h(b, {
						rx: a,
						ry: a
					})
				};
				return l.attr(a)
			},
			setSize: function(a, g, b) {
				var d = this.alignedObjects,
					w = d.length;
				this.width = a;
				this.height = g;
				for(this.boxWrapper.animate({
						width: a,
						height: g
					}, {
						step: function() {
							this.attr({
								viewBox: "0 0 " + this.attr("width") + " " + this.attr("height")
							})
						},
						duration: G(b, !0) ?
							void 0 : 0
					}); w--;) d[w].align()
			},
			g: function(a) {
				var g = this.createElement("g");
				return a ? g.attr({
					"class": "highcharts-" + a
				}) : g
			},
			image: function(a, g, b, d, w, c) {
				var m = {
						preserveAspectRatio: "none"
					},
					f, J = function(a, g) {
						a.setAttributeNS ? a.setAttributeNS("http://www.w3.org/1999/xlink", "href", g) : a.setAttribute("hc-svg-href", g)
					},
					z = function(g) {
						J(f.element, a);
						c.call(f, g)
					};
				1 < arguments.length && l(m, {
					x: g,
					y: b,
					width: d,
					height: w
				});
				f = this.createElement("image").attr(m);
				c ? (J(f.element, "\x3d\x3d"),
					m = new N.Image, F(m, "load", z), m.src = a, m.complete && z({})) : J(f.element, a);
				return f
			},
			symbol: function(a, g, b, d, w, c) {
				var m = this,
					f, J = /^url\((.*?)\)$/,
					z = J.test(a),
					v = !z && (this.symbols[a] ? a : "circle"),
					B = v && this.symbols[v],
					p = x(g) && B && B.call(this.symbols, Math.round(g), Math.round(b), d, w, c),
					D, t;
				B ? (f = this.path(p), f.attr("fill", "none"), l(f, {
					symbolName: v,
					x: g,
					y: b,
					width: d,
					height: w
				}), c && l(f, c)) : z && (D = a.match(J)[1], f = this.image(D), f.imgwidth = G(O[D] && O[D].width, c && c.width), f.imgheight = G(O[D] && O[D].height, c && c.height), t = function() {
					f.attr({
						width: f.width,
						height: f.height
					})
				}, r(["width", "height"], function(a) {
					f[a + "Setter"] = function(a, g) {
						var b = {},
							d = this["img" + g],
							w = "width" === g ? "translateX" : "translateY";
						this[g] = a;
						x(d) && (this.element && this.element.setAttribute(g, d), this.alignByTranslate || (b[w] = ((this[g] || 0) - d) / 2, this.attr(b)))
					}
				}), x(g) && f.attr({
					x: g,
					y: b
				}), f.isImg = !0, x(f.imgwidth) && x(f.imgheight) ? t() : (f.attr({
					width: 0,
					height: 0
				}), q("img", {
					onload: function() {
						var a = e[m.chartIndex];
						0 === this.width && (y(this, {
							position: "absolute",
							top: "-999em"
						}), k.body.appendChild(this));
						O[D] = {
							width: this.width,
							height: this.height
						};
						f.imgwidth = this.width;
						f.imgheight = this.height;
						f.element && t();
						this.parentNode && this.parentNode.removeChild(this);
						m.imgCount--;
						if(!m.imgCount && a && a.onload) a.onload()
					},
					src: D
				}), this.imgCount++));
				return f
			},
			symbols: {
				circle: function(a, g, b, d) {
					return this.arc(a + b / 2, g + d / 2, b / 2, d / 2, {
						start: 0,
						end: 2 * Math.PI,
						open: !1
					})
				},
				square: function(a, g, b, d) {
					return ["M", a, g, "L", a + b, g, a + b, g + d, a, g + d, "Z"]
				},
				triangle: function(a, g, b, d) {
					return ["M", a + b / 2, g, "L", a + b, g + d, a, g + d, "Z"]
				},
				"triangle-down": function(a,
					g, b, d) {
					return ["M", a, g, "L", a + b, g, a + b / 2, g + d, "Z"]
				},
				diamond: function(a, g, b, d) {
					return ["M", a + b / 2, g, "L", a + b, g + d / 2, a + b / 2, g + d, a, g + d / 2, "Z"]
				},
				arc: function(a, g, b, d, w) {
					var c = w.start,
						l = w.r || b,
						m = w.r || d || b,
						f = w.end - .001;
					b = w.innerR;
					d = G(w.open, .001 > Math.abs(w.end - w.start - 2 * Math.PI));
					var J = Math.cos(c),
						v = Math.sin(c),
						z = Math.cos(f),
						f = Math.sin(f);
					w = .001 > w.end - c - Math.PI ? 0 : 1;
					l = ["M", a + l * J, g + m * v, "A", l, m, 0, w, 1, a + l * z, g + m * f];
					x(b) && l.push(d ? "M" : "L", a + b * z, g + b * f, "A", b, b, 0, w, 0, a + b * J, g + b * v);
					l.push(d ? "" : "Z");
					return l
				},
				callout: function(a,
					g, b, d, w) {
					var c = Math.min(w && w.r || 0, b, d),
						l = c + 6,
						m = w && w.anchorX;
					w = w && w.anchorY;
					var f;
					f = ["M", a + c, g, "L", a + b - c, g, "C", a + b, g, a + b, g, a + b, g + c, "L", a + b, g + d - c, "C", a + b, g + d, a + b, g + d, a + b - c, g + d, "L", a + c, g + d, "C", a, g + d, a, g + d, a, g + d - c, "L", a, g + c, "C", a, g, a, g, a + c, g];
					m && m > b ? w > g + l && w < g + d - l ? f.splice(13, 3, "L", a + b, w - 6, a + b + 6, w, a + b, w + 6, a + b, g + d - c) : f.splice(13, 3, "L", a + b, d / 2, m, w, a + b, d / 2, a + b, g + d - c) : m && 0 > m ? w > g + l && w < g + d - l ? f.splice(33, 3, "L", a, w + 6, a - 6, w, a, w - 6, a, g + c) : f.splice(33, 3, "L", a, d / 2, m, w, a, d / 2, a, g + c) : w && w > d && m > a + l && m < a + b - l ? f.splice(23,
						3, "L", m + 6, g + d, m, g + d + 6, m - 6, g + d, a + c, g + d) : w && 0 > w && m > a + l && m < a + b - l && f.splice(3, 3, "L", m - 6, g, m, g - 6, m + 6, g, b - c, g);
					return f
				}
			},
			clipRect: function(g, b, d, w) {
				var c = a.uniqueKey(),
					l = this.createElement("clipPath").attr({
						id: c
					}).add(this.defs);
				g = this.rect(g, b, d, w, 0).add(l);
				g.id = c;
				g.clipPath = l;
				g.count = 0;
				return g
			},
			text: function(a, g, b, d) {
				var w = {};
				if(d && (this.allowHTML || !this.forExport)) return this.html(a, g, b);
				w.x = Math.round(g || 0);
				b && (w.y = Math.round(b));
				if(a || 0 === a) w.text = a;
				a = this.createElement("text").attr(w);
				d || (a.xSetter =
					function(a, g, b) {
						var d = b.getElementsByTagName("tspan"),
							w, c = b.getAttribute(g),
							l;
						for(l = 0; l < d.length; l++) w = d[l], w.getAttribute(g) === c && w.setAttribute(g, a);
						b.setAttribute(g, a)
					});
				return a
			},
			fontMetrics: function(a, b) {
				a = a || b && b.style && b.style.fontSize || this.style && this.style.fontSize;
				a = /px/.test(a) ? g(a) : /em/.test(a) ? parseFloat(a) * (b ? this.fontMetrics(null, b.parentNode).f : 16) : 12;
				b = 24 > a ? a + 3 : Math.round(1.2 * a);
				return {
					h: b,
					b: Math.round(.8 * b),
					f: a
				}
			},
			rotCorr: function(a, g, b) {
				var d = a;
				g && b && (d = Math.max(d * Math.cos(g * f),
					4));
				return {
					x: -a / 3 * Math.sin(g * f),
					y: d
				}
			},
			label: function(g, b, d, c, m, f, J, v, B) {
				var k = this,
					p = k.g("button" !== B && "label"),
					t = p.text = k.text("", 0, 0, J).attr({
						zIndex: 1
					}),
					z, A, Q = 0,
					e = 3,
					P = 0,
					h, O, q, G, I, H = {},
					N, y, M = /^url\((.*?)\)$/.test(c),
					u = M,
					n, L, R, U;
				B && p.addClass("highcharts-" + B);
				u = M;
				n = function() {
					return(N || 0) % 2 / 2
				};
				L = function() {
					var a = t.element.style,
						g = {};
					A = (void 0 === h || void 0 === O || I) && x(t.textStr) && t.getBBox();
					p.width = (h || A.width || 0) + 2 * e + P;
					p.height = (O || A.height || 0) + 2 * e;
					y = e + k.fontMetrics(a && a.fontSize, t).b;
					u && (z || (p.box =
						z = k.symbols[c] || M ? k.symbol(c) : k.rect(), z.addClass(("button" === B ? "" : "highcharts-label-box") + (B ? " highcharts-" + B + "-box" : "")), z.add(p), a = n(), g.x = a, g.y = (v ? -y : 0) + a), g.width = Math.round(p.width), g.height = Math.round(p.height), z.attr(l(g, H)), H = {})
				};
				R = function() {
					var a = P + e,
						g;
					g = v ? 0 : y;
					x(h) && A && ("center" === I || "right" === I) && (a += {
						center: .5,
						right: 1
					}[I] * (h - A.width));
					if(a !== t.x || g !== t.y) t.attr("x", a), t.hasBoxWidthChanged && (A = t.getBBox(!0), L()), void 0 !== g && t.attr("y", g);
					t.x = a;
					t.y = g
				};
				U = function(a, g) {
					z ? z.attr(a, g) : H[a] =
						g
				};
				p.onAdd = function() {
					t.add(p);
					p.attr({
						text: g || 0 === g ? g : "",
						x: b,
						y: d
					});
					z && x(m) && p.attr({
						anchorX: m,
						anchorY: f
					})
				};
				p.widthSetter = function(g) {
					h = a.isNumber(g) ? g : null
				};
				p.heightSetter = function(a) {
					O = a
				};
				p["text-alignSetter"] = function(a) {
					I = a
				};
				p.paddingSetter = function(a) {
					x(a) && a !== e && (e = p.padding = a, R())
				};
				p.paddingLeftSetter = function(a) {
					x(a) && a !== P && (P = a, R())
				};
				p.alignSetter = function(a) {
					a = {
						left: 0,
						center: .5,
						right: 1
					}[a];
					a !== Q && (Q = a, A && p.attr({
						x: q
					}))
				};
				p.textSetter = function(a) {
					void 0 !== a && t.textSetter(a);
					L();
					R()
				};
				p["stroke-widthSetter"] =
					function(a, g) {
						a && (u = !0);
						N = this["stroke-width"] = a;
						U(g, a)
					};
				p.strokeSetter = p.fillSetter = p.rSetter = function(a, g) {
					"r" !== g && ("fill" === g && a && (u = !0), p[g] = a);
					U(g, a)
				};
				p.anchorXSetter = function(a, g) {
					m = p.anchorX = a;
					U(g, Math.round(a) - n() - q)
				};
				p.anchorYSetter = function(a, g) {
					f = p.anchorY = a;
					U(g, a - G)
				};
				p.xSetter = function(a) {
					p.x = a;
					Q && (a -= Q * ((h || A.width) + 2 * e), p["forceAnimate:x"] = !0);
					q = Math.round(a);
					p.attr("translateX", q)
				};
				p.ySetter = function(a) {
					G = p.y = Math.round(a);
					p.attr("translateY", G)
				};
				var S = p.css;
				return l(p, {
					css: function(a) {
						if(a) {
							var g = {};
							a = D(a);
							r(p.textProps, function(b) {
								void 0 !== a[b] && (g[b] = a[b], delete a[b])
							});
							t.css(g);
							"width" in g && L()
						}
						return S.call(p, a)
					},
					getBBox: function() {
						return {
							width: A.width + 2 * e,
							height: A.height + 2 * e,
							x: A.x - e,
							y: A.y - e
						}
					},
					shadow: function(a) {
						a && (L(), z && z.shadow(a));
						return p
					},
					destroy: function() {
						w(p.element, "mouseenter");
						w(p.element, "mouseleave");
						t && (t = t.destroy());
						z && (z = z.destroy());
						C.prototype.destroy.call(p);
						p = k = L = R = U = null
					}
				})
			}
		});
		a.Renderer = E
	})(K);
	(function(a) {
		var C = a.attr,
			E = a.createElement,
			F = a.css,
			n = a.defined,
			h = a.each,
			e = a.extend,
			u = a.isFirefox,
			y = a.isMS,
			q = a.isWebKit,
			x = a.pick,
			f = a.pInt,
			c = a.SVGRenderer,
			k = a.win,
			r = a.wrap;
		e(a.SVGElement.prototype, {
			htmlCss: function(a) {
				var d = this.element;
				if(d = a && "SPAN" === d.tagName && a.width) delete a.width, this.textWidth = d, this.htmlUpdateTransform();
				a && "ellipsis" === a.textOverflow && (a.whiteSpace = "nowrap", a.overflow = "hidden");
				this.styles = e(this.styles, a);
				F(this.element, a);
				return this
			},
			htmlGetBBox: function() {
				var a = this.element;
				return {
					x: a.offsetLeft,
					y: a.offsetTop,
					width: a.offsetWidth,
					height: a.offsetHeight
				}
			},
			htmlUpdateTransform: function() {
				if(this.added) {
					var a = this.renderer,
						d = this.element,
						b = this.translateX || 0,
						c = this.translateY || 0,
						p = this.x || 0,
						k = this.y || 0,
						t = this.textAlign || "left",
						r = {
							left: 0,
							center: .5,
							right: 1
						}[t],
						A = this.styles,
						e = A && A.whiteSpace;
					F(d, {
						marginLeft: b,
						marginTop: c
					});
					this.shadows && h(this.shadows, function(a) {
						F(a, {
							marginLeft: b + 1,
							marginTop: c + 1
						})
					});
					this.inverted && h(d.childNodes, function(b) {
						a.invertChild(b, d)
					});
					if("SPAN" === d.tagName) {
						var A = this.rotation,
							m = this.textWidth && f(this.textWidth),
							D = [A, t, d.innerHTML,
								this.textWidth, this.textAlign
							].join(),
							B;
						(B = m !== this.oldTextWidth) && !(B = m > this.oldTextWidth) && ((B = this.textPxLength) || (F(d, {
							width: "",
							whiteSpace: e || "nowrap"
						}), B = d.offsetWidth), B = B > m);
						B && /[ \-]/.test(d.textContent || d.innerText) ? (F(d, {
							width: m + "px",
							display: "block",
							whiteSpace: e || "normal"
						}), this.oldTextWidth = m, this.hasBoxWidthChanged = !0) : this.hasBoxWidthChanged = !1;
						D !== this.cTT && (e = a.fontMetrics(d.style.fontSize).b, n(A) && A !== (this.oldRotation || 0) && this.setSpanRotation(A, r, e), this.getSpanCorrection(!n(A) &&
							this.textPxLength || d.offsetWidth, e, r, A, t));
						F(d, {
							left: p + (this.xCorr || 0) + "px",
							top: k + (this.yCorr || 0) + "px"
						});
						this.cTT = D;
						this.oldRotation = A
					}
				} else this.alignOnAdd = !0
			},
			setSpanRotation: function(a, d, b) {
				var c = {},
					l = this.renderer.getTransformKey();
				c[l] = c.transform = "rotate(" + a + "deg)";
				c[l + (u ? "Origin" : "-origin")] = c.transformOrigin = 100 * d + "% " + b + "px";
				F(this.element, c)
			},
			getSpanCorrection: function(a, d, b) {
				this.xCorr = -a * b;
				this.yCorr = -d
			}
		});
		e(c.prototype, {
			getTransformKey: function() {
				return y && !/Edge/.test(k.navigator.userAgent) ?
					"-ms-transform" : q ? "-webkit-transform" : u ? "MozTransform" : k.opera ? "-o-transform" : ""
			},
			html: function(a, d, b) {
				var c = this.createElement("span"),
					l = c.element,
					f = c.renderer,
					k = f.isSVG,
					q = function(a, b) {
						h(["opacity", "visibility"], function(d) {
							r(a, d + "Setter", function(a, d, c, m) {
								a.call(this, d, c, m);
								b[c] = d
							})
						});
						a.addedSetters = !0
					};
				c.textSetter = function(a) {
					a !== l.innerHTML && delete this.bBox;
					this.textStr = a;
					l.innerHTML = x(a, "");
					c.doTransform = !0
				};
				k && q(c, c.element.style);
				c.xSetter = c.ySetter = c.alignSetter = c.rotationSetter = function(a,
					b) {
					"align" === b && (b = "textAlign");
					c[b] = a;
					c.doTransform = !0
				};
				c.afterSetters = function() {
					this.doTransform && (this.htmlUpdateTransform(), this.doTransform = !1)
				};
				c.attr({
					text: a,
					x: Math.round(d),
					y: Math.round(b)
				}).css({
					fontFamily: this.style.fontFamily,
					fontSize: this.style.fontSize,
					position: "absolute"
				});
				l.style.whiteSpace = "nowrap";
				c.css = c.htmlCss;
				k && (c.add = function(a) {
					var b, d = f.box.parentNode,
						p = [];
					if(this.parentGroup = a) {
						if(b = a.div, !b) {
							for(; a;) p.push(a), a = a.parentGroup;
							h(p.reverse(), function(a) {
								function m(g, b) {
									a[b] =
										g;
									"translateX" === b ? l.left = g + "px" : l.top = g + "px";
									a.doTransform = !0
								}
								var l, g = C(a.element, "class");
								g && (g = {
									className: g
								});
								b = a.div = a.div || E("div", g, {
									position: "absolute",
									left: (a.translateX || 0) + "px",
									top: (a.translateY || 0) + "px",
									display: a.display,
									opacity: a.opacity,
									pointerEvents: a.styles && a.styles.pointerEvents
								}, b || d);
								l = b.style;
								e(a, {
									classSetter: function(a) {
										return function(g) {
											this.element.setAttribute("class", g);
											a.className = g
										}
									}(b),
									on: function() {
										p[0].div && c.on.apply({
											element: p[0].div
										}, arguments);
										return a
									},
									translateXSetter: m,
									translateYSetter: m
								});
								a.addedSetters || q(a, l)
							})
						}
					} else b = d;
					b.appendChild(l);
					c.added = !0;
					c.alignOnAdd && c.htmlUpdateTransform();
					return c
				});
				return c
			}
		})
	})(K);
	(function(a) {
		var C = a.defined,
			E = a.each,
			F = a.extend,
			n = a.merge,
			h = a.pick,
			e = a.timeUnits,
			u = a.win;
		a.Time = function(a) {
			this.update(a, !1)
		};
		a.Time.prototype = {
			defaultOptions: {},
			update: function(e) {
				var q = h(e && e.useUTC, !0),
					x = this;
				this.options = e = n(!0, this.options || {}, e);
				this.Date = e.Date || u.Date;
				this.timezoneOffset = (this.useUTC = q) && e.timezoneOffset;
				this.getTimezoneOffset =
					this.timezoneOffsetFunction();
				(this.variableTimezone = !(q && !e.getTimezoneOffset && !e.timezone)) || this.timezoneOffset ? (this.get = function(a, c) {
					var f = c.getTime(),
						r = f - x.getTimezoneOffset(c);
					c.setTime(r);
					a = c["getUTC" + a]();
					c.setTime(f);
					return a
				}, this.set = function(f, c, k) {
					var r;
					if(-1 !== a.inArray(f, ["Milliseconds", "Seconds", "Minutes"])) c["set" + f](k);
					else r = x.getTimezoneOffset(c), r = c.getTime() - r, c.setTime(r), c["setUTC" + f](k), f = x.getTimezoneOffset(c), r = c.getTime() + f, c.setTime(r)
				}) : q ? (this.get = function(a, c) {
					return c["getUTC" +
						a]()
				}, this.set = function(a, c, k) {
					return c["setUTC" + a](k)
				}) : (this.get = function(a, c) {
					return c["get" + a]()
				}, this.set = function(a, c, k) {
					return c["set" + a](k)
				})
			},
			makeTime: function(e, q, x, f, c, k) {
				var r, l, d;
				this.useUTC ? (r = this.Date.UTC.apply(0, arguments), l = this.getTimezoneOffset(r), r += l, d = this.getTimezoneOffset(r), l !== d ? r += d - l : l - 36E5 !== this.getTimezoneOffset(r - 36E5) || a.isSafari || (r -= 36E5)) : r = (new this.Date(e, q, h(x, 1), h(f, 0), h(c, 0), h(k, 0))).getTime();
				return r
			},
			timezoneOffsetFunction: function() {
				var e = this,
					h = this.options,
					x = u.moment;
				if(!this.useUTC) return function(a) {
					return 6E4 * (new Date(a)).getTimezoneOffset()
				};
				if(h.timezone) {
					if(x) return function(a) {
						return 6E4 * -x.tz(a, h.timezone).utcOffset()
					};
					a.error(25)
				}
				return this.useUTC && h.getTimezoneOffset ? function(a) {
					return 6E4 * h.getTimezoneOffset(a)
				} : function() {
					return 6E4 * (e.timezoneOffset || 0)
				}
			},
			dateFormat: function(e, h, x) {
				if(!a.defined(h) || isNaN(h)) return a.defaultOptions.lang.invalidDate || "";
				e = a.pick(e, "%Y-%m-%d %H:%M:%S");
				var f = this,
					c = new this.Date(h),
					k = this.get("Hours", c),
					r = this.get("Day", c),
					l = this.get("Date", c),
					d = this.get("Month", c),
					b = this.get("FullYear", c),
					v = a.defaultOptions.lang,
					p = v.weekdays,
					q = v.shortWeekdays,
					t = a.pad,
					c = a.extend({
						a: q ? q[r] : p[r].substr(0, 3),
						A: p[r],
						d: t(l),
						e: t(l, 2, " "),
						w: r,
						b: v.shortMonths[d],
						B: v.months[d],
						m: t(d + 1),
						o: d + 1,
						y: b.toString().substr(2, 2),
						Y: b,
						H: t(k),
						k: k,
						I: t(k % 12 || 12),
						l: k % 12 || 12,
						M: t(f.get("Minutes", c)),
						p: 12 > k ? "AM" : "PM",
						P: 12 > k ? "am" : "pm",
						S: t(c.getSeconds()),
						L: t(Math.round(h % 1E3), 3)
					}, a.dateFormats);
				a.objectEach(c, function(a, b) {
					for(; - 1 !== e.indexOf("%" +
							b);) e = e.replace("%" + b, "function" === typeof a ? a.call(f, h) : a)
				});
				return x ? e.substr(0, 1).toUpperCase() + e.substr(1) : e
			},
			getTimeTicks: function(a, q, x, f) {
				var c = this,
					k = [],
					r = {},
					l, d = new c.Date(q),
					b = a.unitRange,
					v = a.count || 1,
					p;
				if(C(q)) {
					c.set("Milliseconds", d, b >= e.second ? 0 : v * Math.floor(c.get("Milliseconds", d) / v));
					b >= e.second && c.set("Seconds", d, b >= e.minute ? 0 : v * Math.floor(c.get("Seconds", d) / v));
					b >= e.minute && c.set("Minutes", d, b >= e.hour ? 0 : v * Math.floor(c.get("Minutes", d) / v));
					b >= e.hour && c.set("Hours", d, b >= e.day ? 0 : v * Math.floor(c.get("Hours",
						d) / v));
					b >= e.day && c.set("Date", d, b >= e.month ? 1 : v * Math.floor(c.get("Date", d) / v));
					b >= e.month && (c.set("Month", d, b >= e.year ? 0 : v * Math.floor(c.get("Month", d) / v)), l = c.get("FullYear", d));
					b >= e.year && c.set("FullYear", d, l - l % v);
					b === e.week && c.set("Date", d, c.get("Date", d) - c.get("Day", d) + h(f, 1));
					l = c.get("FullYear", d);
					f = c.get("Month", d);
					var I = c.get("Date", d),
						t = c.get("Hours", d);
					q = d.getTime();
					c.variableTimezone && (p = x - q > 4 * e.month || c.getTimezoneOffset(q) !== c.getTimezoneOffset(x));
					d = d.getTime();
					for(q = 1; d < x;) k.push(d), d =
						b === e.year ? c.makeTime(l + q * v, 0) : b === e.month ? c.makeTime(l, f + q * v) : !p || b !== e.day && b !== e.week ? p && b === e.hour && 1 < v ? c.makeTime(l, f, I, t + q * v) : d + b * v : c.makeTime(l, f, I + q * v * (b === e.day ? 1 : 7)), q++;
					k.push(d);
					b <= e.hour && 1E4 > k.length && E(k, function(a) {
						0 === a % 18E5 && "000000000" === c.dateFormat("%H%M%S%L", a) && (r[a] = "day")
					})
				}
				k.info = F(a, {
					higherRanks: r,
					totalRange: b * v
				});
				return k
			}
		}
	})(K);
	(function(a) {
		var C = a.color,
			E = a.merge;
		a.defaultOptions = {
			colors: "#7cb5ec #434348 #90ed7d #f7a35c #8085e9 #f15c80 #e4d354 #2b908f #f45b5b #91e8e1".split(" "),
			symbols: ["circle", "diamond", "square", "triangle", "triangle-down"],
			lang: {
				loading: "Loading...",
				months: "January February March April May June July August September October November December".split(" "),
				shortMonths: "Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "),
				weekdays: "Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "),
				decimalPoint: ".",
				numericSymbols: "kMGTPE".split(""),
				resetZoom: "Reset zoom",
				resetZoomTitle: "Reset zoom level 1:1",
				thousandsSep: " "
			},
			global: {},
			time: a.Time.prototype.defaultOptions,
			chart: {
				borderRadius: 0,
				defaultSeriesType: "line",
				ignoreHiddenSeries: !0,
				spacing: [10, 10, 15, 10],
				resetZoomButton: {
					theme: {
						zIndex: 6
					},
					position: {
						align: "right",
						x: -10,
						y: 10
					}
				},
				width: null,
				height: null,
				borderColor: "#335cad",
				backgroundColor: "#ffffff",
				plotBorderColor: "#cccccc"
			},
			title: {
				text: "Chart title",
				align: "center",
				margin: 15,
				widthAdjust: -44
			},
			subtitle: {
				text: "",
				align: "center",
				widthAdjust: -44
			},
			plotOptions: {},
			labels: {
				style: {
					position: "absolute",
					color: "#333333"
				}
			},
			legend: {
				enabled: !0,
				align: "center",
				alignColumns: !0,
				layout: "horizontal",
				labelFormatter: function() {
					return this.name
				},
				borderColor: "#999999",
				borderRadius: 0,
				navigation: {
					activeColor: "#003399",
					inactiveColor: "#cccccc"
				},
				itemStyle: {
					color: "#333333",
					fontSize: "12px",
					fontWeight: "bold",
					textOverflow: "ellipsis"
				},
				itemHoverStyle: {
					color: "#000000"
				},
				itemHiddenStyle: {
					color: "#cccccc"
				},
				shadow: !1,
				itemCheckboxStyle: {
					position: "absolute",
					width: "13px",
					height: "13px"
				},
				squareSymbol: !0,
				symbolPadding: 5,
				verticalAlign: "bottom",
				x: 0,
				y: 0,
				title: {
					style: {
						fontWeight: "bold"
					}
				}
			},
			loading: {
				labelStyle: {
					fontWeight: "bold",
					position: "relative",
					top: "45%"
				},
				style: {
					position: "absolute",
					backgroundColor: "#ffffff",
					opacity: .5,
					textAlign: "center"
				}
			},
			tooltip: {
				enabled: !0,
				animation: a.svg,
				borderRadius: 3,
				dateTimeLabelFormats: {
					millisecond: "%A, %b %e, %H:%M:%S.%L",
					second: "%A, %b %e, %H:%M:%S",
					minute: "%A, %b %e, %H:%M",
					hour: "%A, %b %e, %H:%M",
					day: "%A, %b %e, %Y",
					week: "Week from %A, %b %e, %Y",
					month: "%B %Y",
					year: "%Y"
				},
				footerFormat: "",
				padding: 8,
				snap: a.isTouchDevice ? 25 : 10,
				backgroundColor: C("#f7f7f7").setOpacity(.85).get(),
				borderWidth: 1,
				headerFormat: '\x3cspan style\x3d"font-size: 10px"\x3e{point.key}\x3c/span\x3e\x3cbr/\x3e',
				pointFormat: '\x3cspan style\x3d"color:{point.color}"\x3e\u25cf\x3c/span\x3e {series.name}: \x3cb\x3e{point.y}\x3c/b\x3e\x3cbr/\x3e',
				shadow: !0,
				style: {
					color: "#333333",
					cursor: "default",
					fontSize: "12px",
					pointerEvents: "none",
					whiteSpace: "nowrap"
				}
			},
			credits: {
				enabled: !0,
				href: "http://www.highcharts.com",
				position: {
					align: "right",
					x: -10,
					verticalAlign: "bottom",
					y: -5
				},
				style: {
					cursor: "pointer",
					color: "#999999",
					fontSize: "9px"
				},
				text: "Highcharts.com"
			}
		};
		a.setOptions = function(C) {
			a.defaultOptions = E(!0, a.defaultOptions, C);
			a.time.update(E(a.defaultOptions.global,
				a.defaultOptions.time), !1);
			return a.defaultOptions
		};
		a.getOptions = function() {
			return a.defaultOptions
		};
		a.defaultPlotOptions = a.defaultOptions.plotOptions;
		a.time = new a.Time(E(a.defaultOptions.global, a.defaultOptions.time));
		a.dateFormat = function(C, n, h) {
			return a.time.dateFormat(C, n, h)
		}
	})(K);
	(function(a) {
		var C = a.correctFloat,
			E = a.defined,
			F = a.destroyObjectProperties,
			n = a.fireEvent,
			h = a.isNumber,
			e = a.merge,
			u = a.pick,
			y = a.deg2rad;
		a.Tick = function(a, e, f, c) {
			this.axis = a;
			this.pos = e;
			this.type = f || "";
			this.isNewLabel = this.isNew = !0;
			f || c || this.addLabel()
		};
		a.Tick.prototype = {
			addLabel: function() {
				var a = this.axis,
					h = a.options,
					f = a.chart,
					c = a.categories,
					k = a.names,
					r = this.pos,
					l = h.labels,
					d = a.tickPositions,
					b = r === d[0],
					v = r === d[d.length - 1],
					k = c ? u(c[r], k[r], r) : r,
					c = this.label,
					d = d.info,
					p;
				a.isDatetimeAxis && d && (p = h.dateTimeLabelFormats[d.higherRanks[r] || d.unitName]);
				this.isFirst = b;
				this.isLast = v;
				h = a.labelFormatter.call({
					axis: a,
					chart: f,
					isFirst: b,
					isLast: v,
					dateTimeLabelFormat: p,
					value: a.isLog ? C(a.lin2log(k)) : k,
					pos: r
				});
				if(E(c)) c && c.attr({
					text: h
				});
				else {
					if(this.label =
						c = E(h) && l.enabled ? f.renderer.text(h, 0, 0, l.useHTML).css(e(l.style)).add(a.labelGroup) : null) c.textPxLength = c.getBBox().width;
					this.rotation = 0
				}
			},
			getLabelSize: function() {
				return this.label ? this.label.getBBox()[this.axis.horiz ? "height" : "width"] : 0
			},
			handleOverflow: function(a) {
				var e = this.axis,
					f = e.options.labels,
					c = a.x,
					k = e.chart.chartWidth,
					r = e.chart.spacing,
					l = u(e.labelLeft, Math.min(e.pos, r[3])),
					r = u(e.labelRight, Math.max(e.isRadial ? 0 : e.pos + e.len, k - r[1])),
					d = this.label,
					b = this.rotation,
					v = {
						left: 0,
						center: .5,
						right: 1
					}[e.labelAlign ||
						d.attr("align")
					],
					p = d.getBBox().width,
					h = e.getSlotWidth(this),
					t = h,
					q = 1,
					A, H = {};
				if(b || !1 === f.overflow) 0 > b && c - v * p < l ? A = Math.round(c / Math.cos(b * y) - l) : 0 < b && c + v * p > r && (A = Math.round((k - c) / Math.cos(b * y)));
				else if(k = c + (1 - v) * p, c - v * p < l ? t = a.x + t * (1 - v) - l : k > r && (t = r - a.x + t * v, q = -1), t = Math.min(h, t), t < h && "center" === e.labelAlign && (a.x += q * (h - t - v * (h - Math.min(p, t)))), p > t || e.autoRotation && (d.styles || {}).width) A = t;
				A && (H.width = A, (f.style || {}).textOverflow || (H.textOverflow = "ellipsis"), d.css(H))
			},
			getPosition: function(e, h, f, c) {
				var k =
					this.axis,
					r = k.chart,
					l = c && r.oldChartHeight || r.chartHeight;
				e = {
					x: e ? a.correctFloat(k.translate(h + f, null, null, c) + k.transB) : k.left + k.offset + (k.opposite ? (c && r.oldChartWidth || r.chartWidth) - k.right - k.left : 0),
					y: e ? l - k.bottom + k.offset - (k.opposite ? k.height : 0) : a.correctFloat(l - k.translate(h + f, null, null, c) - k.transB)
				};
				n(this, "afterGetPosition", {
					pos: e
				});
				return e
			},
			getLabelPosition: function(a, e, f, c, k, r, l, d) {
				var b = this.axis,
					v = b.transA,
					p = b.reversed,
					h = b.staggerLines,
					t = b.tickRotCorr || {
						x: 0,
						y: 0
					},
					q = k.y,
					A = c || b.reserveSpaceDefault ?
					0 : -b.labelOffset * ("center" === b.labelAlign ? .5 : 1),
					x = {};
				E(q) || (q = 0 === b.side ? f.rotation ? -8 : -f.getBBox().height : 2 === b.side ? t.y + 8 : Math.cos(f.rotation * y) * (t.y - f.getBBox(!1, 0).height / 2));
				a = a + k.x + A + t.x - (r && c ? r * v * (p ? -1 : 1) : 0);
				e = e + q - (r && !c ? r * v * (p ? 1 : -1) : 0);
				h && (f = l / (d || 1) % h, b.opposite && (f = h - f - 1), e += b.labelOffset / h * f);
				x.x = a;
				x.y = Math.round(e);
				n(this, "afterGetLabelPosition", {
					pos: x
				});
				return x
			},
			getMarkPath: function(a, e, f, c, k, r) {
				return r.crispLine(["M", a, e, "L", a + (k ? 0 : -f), e + (k ? f : 0)], c)
			},
			renderGridLine: function(a, e, f) {
				var c =
					this.axis,
					k = c.options,
					r = this.gridLine,
					l = {},
					d = this.pos,
					b = this.type,
					v = c.tickmarkOffset,
					p = c.chart.renderer,
					h = b ? b + "Grid" : "grid",
					t = k[h + "LineWidth"],
					q = k[h + "LineColor"],
					k = k[h + "LineDashStyle"];
				r || (l.stroke = q, l["stroke-width"] = t, k && (l.dashstyle = k), b || (l.zIndex = 1), a && (l.opacity = 0), this.gridLine = r = p.path().attr(l).addClass("highcharts-" + (b ? b + "-" : "") + "grid-line").add(c.gridGroup));
				if(!a && r && (a = c.getPlotLinePath(d + v, r.strokeWidth() * f, a, !0))) r[this.isNew ? "attr" : "animate"]({
					d: a,
					opacity: e
				})
			},
			renderMark: function(a,
				e, f) {
				var c = this.axis,
					k = c.options,
					r = c.chart.renderer,
					l = this.type,
					d = l ? l + "Tick" : "tick",
					b = c.tickSize(d),
					v = this.mark,
					p = !v,
					h = a.x;
				a = a.y;
				var t = u(k[d + "Width"], !l && c.isXAxis ? 1 : 0),
					k = k[d + "Color"];
				b && (c.opposite && (b[0] = -b[0]), p && (this.mark = v = r.path().addClass("highcharts-" + (l ? l + "-" : "") + "tick").add(c.axisGroup), v.attr({
					stroke: k,
					"stroke-width": t
				})), v[p ? "attr" : "animate"]({
					d: this.getMarkPath(h, a, b[0], v.strokeWidth() * f, c.horiz, r),
					opacity: e
				}))
			},
			renderLabel: function(a, e, f, c) {
				var k = this.axis,
					r = k.horiz,
					l = k.options,
					d = this.label,
					b = l.labels,
					v = b.step,
					k = k.tickmarkOffset,
					p = !0,
					I = a.x;
				a = a.y;
				d && h(I) && (d.xy = a = this.getLabelPosition(I, a, d, r, b, k, c, v), this.isFirst && !this.isLast && !u(l.showFirstLabel, 1) || this.isLast && !this.isFirst && !u(l.showLastLabel, 1) ? p = !1 : !r || b.step || b.rotation || e || 0 === f || this.handleOverflow(a), v && c % v && (p = !1), p && h(a.y) ? (a.opacity = f, d[this.isNewLabel ? "attr" : "animate"](a), this.isNewLabel = !1) : (d.attr("y", -9999), this.isNewLabel = !0))
			},
			render: function(e, h, f) {
				var c = this.axis,
					k = c.horiz,
					r = this.getPosition(k, this.pos, c.tickmarkOffset,
						h),
					l = r.x,
					d = r.y,
					c = k && l === c.pos + c.len || !k && d === c.pos ? -1 : 1;
				f = u(f, 1);
				this.isActive = !0;
				this.renderGridLine(h, f, c);
				this.renderMark(r, f, c);
				this.renderLabel(r, h, f, e);
				this.isNew = !1;
				a.fireEvent(this, "afterRender")
			},
			destroy: function() {
				F(this, this.axis)
			}
		}
	})(K);
	var V = function(a) {
		var C = a.addEvent,
			E = a.animObject,
			F = a.arrayMax,
			n = a.arrayMin,
			h = a.color,
			e = a.correctFloat,
			u = a.defaultOptions,
			y = a.defined,
			q = a.deg2rad,
			x = a.destroyObjectProperties,
			f = a.each,
			c = a.extend,
			k = a.fireEvent,
			r = a.format,
			l = a.getMagnitude,
			d = a.grep,
			b = a.inArray,
			v = a.isArray,
			p = a.isNumber,
			I = a.isString,
			t = a.merge,
			L = a.normalizeTickInterval,
			A = a.objectEach,
			H = a.pick,
			m = a.removeEvent,
			D = a.splat,
			B = a.syncTimeout,
			M = a.Tick,
			G = function() {
				this.init.apply(this, arguments)
			};
		a.extend(G.prototype, {
			defaultOptions: {
				dateTimeLabelFormats: {
					millisecond: "%H:%M:%S.%L",
					second: "%H:%M:%S",
					minute: "%H:%M",
					hour: "%H:%M",
					day: "%e. %b",
					week: "%e. %b",
					month: "%b '%y",
					year: "%Y"
				},
				endOnTick: !1,
				labels: {
					enabled: !0,
					style: {
						color: "#666666",
						cursor: "default",
						fontSize: "11px"
					},
					x: 0
				},
				maxPadding: .01,
				minorTickLength: 2,
				minorTickPosition: "outside",
				minPadding: .01,
				startOfWeek: 1,
				startOnTick: !1,
				tickLength: 10,
				tickmarkPlacement: "between",
				tickPixelInterval: 100,
				tickPosition: "outside",
				title: {
					align: "middle",
					style: {
						color: "#666666"
					}
				},
				type: "linear",
				minorGridLineColor: "#f2f2f2",
				minorGridLineWidth: 1,
				minorTickColor: "#999999",
				lineColor: "#ccd6eb",
				lineWidth: 1,
				gridLineColor: "#e6e6e6",
				tickColor: "#ccd6eb"
			},
			defaultYAxisOptions: {
				endOnTick: !0,
				tickPixelInterval: 72,
				showLastLabel: !0,
				labels: {
					x: -8
				},
				maxPadding: .05,
				minPadding: .05,
				startOnTick: !0,
				title: {
					rotation: 270,
					text: "Values"
				},
				stackLabels: {
					allowOverlap: !1,
					enabled: !1,
					formatter: function() {
						return a.numberFormat(this.total, -1)
					},
					style: {
						fontSize: "11px",
						fontWeight: "bold",
						color: "#000000",
						textOutline: "1px contrast"
					}
				},
				gridLineWidth: 1,
				lineWidth: 0
			},
			defaultLeftAxisOptions: {
				labels: {
					x: -15
				},
				title: {
					rotation: 270
				}
			},
			defaultRightAxisOptions: {
				labels: {
					x: 15
				},
				title: {
					rotation: 90
				}
			},
			defaultBottomAxisOptions: {
				labels: {
					autoRotation: [-45],
					x: 0
				},
				title: {
					rotation: 0
				}
			},
			defaultTopAxisOptions: {
				labels: {
					autoRotation: [-45],
					x: 0
				},
				title: {
					rotation: 0
				}
			},
			init: function(a, d) {
				var g = d.isX,
					w = this;
				w.chart = a;
				w.horiz = a.inverted && !w.isZAxis ? !g : g;
				w.isXAxis = g;
				w.coll = w.coll || (g ? "xAxis" : "yAxis");
				k(this, "init", {
					userOptions: d
				});
				w.opposite = d.opposite;
				w.side = d.side || (w.horiz ? w.opposite ? 0 : 2 : w.opposite ? 1 : 3);
				w.setOptions(d);
				var c = this.options,
					m = c.type;
				w.labelFormatter = c.labels.formatter || w.defaultLabelFormatter;
				w.userOptions = d;
				w.minPixelPadding = 0;
				w.reversed = c.reversed;
				w.visible = !1 !== c.visible;
				w.zoomEnabled = !1 !== c.zoomEnabled;
				w.hasNames = "category" ===
					m || !0 === c.categories;
				w.categories = c.categories || w.hasNames;
				w.names || (w.names = [], w.names.keys = {});
				w.plotLinesAndBandsGroups = {};
				w.isLog = "logarithmic" === m;
				w.isDatetimeAxis = "datetime" === m;
				w.positiveValuesOnly = w.isLog && !w.allowNegativeLog;
				w.isLinked = y(c.linkedTo);
				w.ticks = {};
				w.labelEdge = [];
				w.minorTicks = {};
				w.plotLinesAndBands = [];
				w.alternateBands = {};
				w.len = 0;
				w.minRange = w.userMinRange = c.minRange || c.maxZoom;
				w.range = c.range;
				w.offset = c.offset || 0;
				w.stacks = {};
				w.oldStacks = {};
				w.stacksTouched = 0;
				w.max = null;
				w.min = null;
				w.crosshair = H(c.crosshair, D(a.options.tooltip.crosshairs)[g ? 0 : 1], !1);
				d = w.options.events; - 1 === b(w, a.axes) && (g ? a.axes.splice(a.xAxis.length, 0, w) : a.axes.push(w), a[w.coll].push(w));
				w.series = w.series || [];
				a.inverted && !w.isZAxis && g && void 0 === w.reversed && (w.reversed = !0);
				A(d, function(a, g) {
					C(w, g, a)
				});
				w.lin2log = c.linearToLogConverter || w.lin2log;
				w.isLog && (w.val2lin = w.log2lin, w.lin2val = w.lin2log);
				k(this, "afterInit")
			},
			setOptions: function(a) {
				this.options = t(this.defaultOptions, "yAxis" === this.coll && this.defaultYAxisOptions, [this.defaultTopAxisOptions, this.defaultRightAxisOptions, this.defaultBottomAxisOptions, this.defaultLeftAxisOptions][this.side], t(u[this.coll], a));
				k(this, "afterSetOptions", {
					userOptions: a
				})
			},
			defaultLabelFormatter: function() {
				var g = this.axis,
					b = this.value,
					d = g.chart.time,
					c = g.categories,
					m = this.dateTimeLabelFormat,
					l = u.lang,
					f = l.numericSymbols,
					l = l.numericSymbolMagnitude || 1E3,
					p = f && f.length,
					k, v = g.options.labels.format,
					g = g.isLog ? Math.abs(b) : g.tickInterval;
				if(v) k = r(v, this, d);
				else if(c) k = b;
				else if(m) k = d.dateFormat(m,
					b);
				else if(p && 1E3 <= g)
					for(; p-- && void 0 === k;) d = Math.pow(l, p + 1), g >= d && 0 === 10 * b % d && null !== f[p] && 0 !== b && (k = a.numberFormat(b / d, -1) + f[p]);
				void 0 === k && (k = 1E4 <= Math.abs(b) ? a.numberFormat(b, -1) : a.numberFormat(b, -1, void 0, ""));
				return k
			},
			getSeriesExtremes: function() {
				var a = this,
					b = a.chart;
				k(this, "getSeriesExtremes", null, function() {
					a.hasVisibleSeries = !1;
					a.dataMin = a.dataMax = a.threshold = null;
					a.softThreshold = !a.isXAxis;
					a.buildStacks && a.buildStacks();
					f(a.series, function(g) {
						if(g.visible || !b.options.chart.ignoreHiddenSeries) {
							var w =
								g.options,
								c = w.threshold,
								m;
							a.hasVisibleSeries = !0;
							a.positiveValuesOnly && 0 >= c && (c = null);
							if(a.isXAxis) w = g.xData, w.length && (g = n(w), m = F(w), p(g) || g instanceof Date || (w = d(w, p), g = n(w), m = F(w)), w.length && (a.dataMin = Math.min(H(a.dataMin, w[0], g), g), a.dataMax = Math.max(H(a.dataMax, w[0], m), m)));
							else if(g.getExtremes(), m = g.dataMax, g = g.dataMin, y(g) && y(m) && (a.dataMin = Math.min(H(a.dataMin, g), g), a.dataMax = Math.max(H(a.dataMax, m), m)), y(c) && (a.threshold = c), !w.softThreshold || a.positiveValuesOnly) a.softThreshold = !1
						}
					})
				});
				k(this, "afterGetSeriesExtremes")
			},
			translate: function(a, b, d, c, m, l) {
				var g = this.linkedParent || this,
					w = 1,
					f = 0,
					J = c ? g.oldTransA : g.transA;
				c = c ? g.oldMin : g.min;
				var k = g.minPixelPadding;
				m = (g.isOrdinal || g.isBroken || g.isLog && m) && g.lin2val;
				J || (J = g.transA);
				d && (w *= -1, f = g.len);
				g.reversed && (w *= -1, f -= w * (g.sector || g.len));
				b ? (a = (a * w + f - k) / J + c, m && (a = g.lin2val(a))) : (m && (a = g.val2lin(a)), a = p(c) ? w * (a - c) * J + f + w * k + (p(l) ? J * l : 0) : void 0);
				return a
			},
			toPixels: function(a, b) {
				return this.translate(a, !1, !this.horiz, null, !0) + (b ? 0 : this.pos)
			},
			toValue: function(a, b) {
				return this.translate(a - (b ? 0 : this.pos), !0, !this.horiz, null, !0)
			},
			getPlotLinePath: function(a, b, d, c, m) {
				var g = this.chart,
					w = this.left,
					l = this.top,
					f, J, k = d && g.oldChartHeight || g.chartHeight,
					v = d && g.oldChartWidth || g.chartWidth,
					e;
				f = this.transB;
				var B = function(a, g, b) {
					if(a < g || a > b) c ? a = Math.min(Math.max(g, a), b) : e = !0;
					return a
				};
				m = H(m, this.translate(a, null, null, d));
				m = Math.min(Math.max(-1E5, m), 1E5);
				a = d = Math.round(m + f);
				f = J = Math.round(k - m - f);
				p(m) ? this.horiz ? (f = l, J = k - this.bottom, a = d = B(a, w, w + this.width)) :
					(a = w, d = v - this.right, f = J = B(f, l, l + this.height)) : (e = !0, c = !1);
				return e && !c ? null : g.renderer.crispLine(["M", a, f, "L", d, J], b || 1)
			},
			getLinearTickPositions: function(a, b, d) {
				var g, w = e(Math.floor(b / a) * a);
				d = e(Math.ceil(d / a) * a);
				var c = [],
					m;
				e(w + a) === w && (m = 20);
				if(this.single) return [b];
				for(b = w; b <= d;) {
					c.push(b);
					b = e(b + a, m);
					if(b === g) break;
					g = b
				}
				return c
			},
			getMinorTickInterval: function() {
				var a = this.options;
				return !0 === a.minorTicks ? H(a.minorTickInterval, "auto") : !1 === a.minorTicks ? null : a.minorTickInterval
			},
			getMinorTickPositions: function() {
				var a =
					this,
					b = a.options,
					d = a.tickPositions,
					c = a.minorTickInterval,
					m = [],
					l = a.pointRangePadding || 0,
					p = a.min - l,
					l = a.max + l,
					k = l - p;
				if(k && k / c < a.len / 3)
					if(a.isLog) f(this.paddedTicks, function(g, b, d) {
						b && m.push.apply(m, a.getLogTickPositions(c, d[b - 1], d[b], !0))
					});
					else if(a.isDatetimeAxis && "auto" === this.getMinorTickInterval()) m = m.concat(a.getTimeTicks(a.normalizeTimeTickInterval(c), p, l, b.startOfWeek));
				else
					for(b = p + (d[0] - p) % c; b <= l && b !== m[0]; b += c) m.push(b);
				0 !== m.length && a.trimTicks(m);
				return m
			},
			adjustForMinRange: function() {
				var a =
					this.options,
					b = this.min,
					d = this.max,
					c, m, l, p, k, v, e, B;
				this.isXAxis && void 0 === this.minRange && !this.isLog && (y(a.min) || y(a.max) ? this.minRange = null : (f(this.series, function(a) {
					v = a.xData;
					for(p = e = a.xIncrement ? 1 : v.length - 1; 0 < p; p--)
						if(k = v[p] - v[p - 1], void 0 === l || k < l) l = k
				}), this.minRange = Math.min(5 * l, this.dataMax - this.dataMin)));
				d - b < this.minRange && (m = this.dataMax - this.dataMin >= this.minRange, B = this.minRange, c = (B - d + b) / 2, c = [b - c, H(a.min, b - c)], m && (c[2] = this.isLog ? this.log2lin(this.dataMin) : this.dataMin), b = F(c), d = [b + B,
					H(a.max, b + B)
				], m && (d[2] = this.isLog ? this.log2lin(this.dataMax) : this.dataMax), d = n(d), d - b < B && (c[0] = d - B, c[1] = H(a.min, d - B), b = F(c)));
				this.min = b;
				this.max = d
			},
			getClosest: function() {
				var a;
				this.categories ? a = 1 : f(this.series, function(g) {
					var b = g.closestPointRange,
						d = g.visible || !g.chart.options.chart.ignoreHiddenSeries;
					!g.noSharedTooltip && y(b) && d && (a = y(a) ? Math.min(a, b) : b)
				});
				return a
			},
			nameToX: function(a) {
				var g = v(this.categories),
					d = g ? this.categories : this.names,
					c = a.options.x,
					m;
				a.series.requireSorting = !1;
				y(c) || (c = !1 ===
					this.options.uniqueNames ? a.series.autoIncrement() : g ? b(a.name, d) : H(d.keys[a.name], -1)); - 1 === c ? g || (m = d.length) : m = c;
				void 0 !== m && (this.names[m] = a.name, this.names.keys[a.name] = m);
				return m
			},
			updateNames: function() {
				var g = this,
					b = this.names;
				0 < b.length && (f(a.keys(b.keys), function(a) {
					delete b.keys[a]
				}), b.length = 0, this.minRange = this.userMinRange, f(this.series || [], function(a) {
					a.xIncrement = null;
					if(!a.points || a.isDirtyData) a.processData(), a.generatePoints();
					f(a.points, function(b, d) {
						var c;
						b.options && (c = g.nameToX(b),
							void 0 !== c && c !== b.x && (b.x = c, a.xData[d] = c))
					})
				}))
			},
			setAxisTranslation: function(a) {
				var b = this,
					g = b.max - b.min,
					d = b.axisPointRange || 0,
					c, m = 0,
					l = 0,
					p = b.linkedParent,
					v = !!b.categories,
					B = b.transA,
					e = b.isXAxis;
				if(e || v || d) c = b.getClosest(), p ? (m = p.minPointOffset, l = p.pointRangePadding) : f(b.series, function(a) {
						var g = v ? 1 : e ? H(a.options.pointRange, c, 0) : b.axisPointRange || 0;
						a = a.options.pointPlacement;
						d = Math.max(d, g);
						b.single || (m = Math.max(m, I(a) ? 0 : g / 2), l = Math.max(l, "on" === a ? 0 : g))
					}), p = b.ordinalSlope && c ? b.ordinalSlope / c : 1, b.minPointOffset =
					m *= p, b.pointRangePadding = l *= p, b.pointRange = Math.min(d, g), e && (b.closestPointRange = c);
				a && (b.oldTransA = B);
				b.translationSlope = b.transA = B = b.options.staticScale || b.len / (g + l || 1);
				b.transB = b.horiz ? b.left : b.bottom;
				b.minPixelPadding = B * m;
				k(this, "afterSetAxisTranslation")
			},
			minFromRange: function() {
				return this.max - this.range
			},
			setTickInterval: function(b) {
				var g = this,
					d = g.chart,
					c = g.options,
					m = g.isLog,
					v = g.isDatetimeAxis,
					B = g.isXAxis,
					t = g.isLinked,
					r = c.maxPadding,
					D = c.minPadding,
					h = c.tickInterval,
					A = c.tickPixelInterval,
					G = g.categories,
					I = p(g.threshold) ? g.threshold : null,
					x = g.softThreshold,
					q, u, M, n;
				v || G || t || this.getTickAmount();
				M = H(g.userMin, c.min);
				n = H(g.userMax, c.max);
				t ? (g.linkedParent = d[g.coll][c.linkedTo], d = g.linkedParent.getExtremes(), g.min = H(d.min, d.dataMin), g.max = H(d.max, d.dataMax), c.type !== g.linkedParent.options.type && a.error(11, 1)) : (!x && y(I) && (g.dataMin >= I ? (q = I, D = 0) : g.dataMax <= I && (u = I, r = 0)), g.min = H(M, q, g.dataMin), g.max = H(n, u, g.dataMax));
				m && (g.positiveValuesOnly && !b && 0 >= Math.min(g.min, H(g.dataMin, g.min)) && a.error(10, 1), g.min =
					e(g.log2lin(g.min), 15), g.max = e(g.log2lin(g.max), 15));
				g.range && y(g.max) && (g.userMin = g.min = M = Math.max(g.dataMin, g.minFromRange()), g.userMax = n = g.max, g.range = null);
				k(g, "foundExtremes");
				g.beforePadding && g.beforePadding();
				g.adjustForMinRange();
				!(G || g.axisPointRange || g.usePercentage || t) && y(g.min) && y(g.max) && (d = g.max - g.min) && (!y(M) && D && (g.min -= d * D), !y(n) && r && (g.max += d * r));
				p(c.softMin) && !p(g.userMin) && (g.min = Math.min(g.min, c.softMin));
				p(c.softMax) && !p(g.userMax) && (g.max = Math.max(g.max, c.softMax));
				p(c.floor) &&
					(g.min = Math.max(g.min, c.floor));
				p(c.ceiling) && (g.max = Math.min(g.max, c.ceiling));
				x && y(g.dataMin) && (I = I || 0, !y(M) && g.min < I && g.dataMin >= I ? g.min = I : !y(n) && g.max > I && g.dataMax <= I && (g.max = I));
				g.tickInterval = g.min === g.max || void 0 === g.min || void 0 === g.max ? 1 : t && !h && A === g.linkedParent.options.tickPixelInterval ? h = g.linkedParent.tickInterval : H(h, this.tickAmount ? (g.max - g.min) / Math.max(this.tickAmount - 1, 1) : void 0, G ? 1 : (g.max - g.min) * A / Math.max(g.len, A));
				B && !b && f(g.series, function(a) {
					a.processData(g.min !== g.oldMin || g.max !==
						g.oldMax)
				});
				g.setAxisTranslation(!0);
				g.beforeSetTickPositions && g.beforeSetTickPositions();
				g.postProcessTickInterval && (g.tickInterval = g.postProcessTickInterval(g.tickInterval));
				g.pointRange && !h && (g.tickInterval = Math.max(g.pointRange, g.tickInterval));
				b = H(c.minTickInterval, g.isDatetimeAxis && g.closestPointRange);
				!h && g.tickInterval < b && (g.tickInterval = b);
				v || m || h || (g.tickInterval = L(g.tickInterval, null, l(g.tickInterval), H(c.allowDecimals, !(.5 < g.tickInterval && 5 > g.tickInterval && 1E3 < g.max && 9999 > g.max)), !!this.tickAmount));
				this.tickAmount || (g.tickInterval = g.unsquish());
				this.setTickPositions()
			},
			setTickPositions: function() {
				var a = this.options,
					b, d = a.tickPositions;
				b = this.getMinorTickInterval();
				var c = a.tickPositioner,
					m = a.startOnTick,
					l = a.endOnTick;
				this.tickmarkOffset = this.categories && "between" === a.tickmarkPlacement && 1 === this.tickInterval ? .5 : 0;
				this.minorTickInterval = "auto" === b && this.tickInterval ? this.tickInterval / 5 : b;
				this.single = this.min === this.max && y(this.min) && !this.tickAmount && (parseInt(this.min, 10) === this.min || !1 !== a.allowDecimals);
				this.tickPositions = b = d && d.slice();
				!b && (b = this.isDatetimeAxis ? this.getTimeTicks(this.normalizeTimeTickInterval(this.tickInterval, a.units), this.min, this.max, a.startOfWeek, this.ordinalPositions, this.closestPointRange, !0) : this.isLog ? this.getLogTickPositions(this.tickInterval, this.min, this.max) : this.getLinearTickPositions(this.tickInterval, this.min, this.max), b.length > this.len && (b = [b[0], b.pop()], b[0] === b[1] && (b.length = 1)), this.tickPositions = b, c && (c = c.apply(this, [this.min, this.max]))) && (this.tickPositions =
					b = c);
				this.paddedTicks = b.slice(0);
				this.trimTicks(b, m, l);
				this.isLinked || (this.single && 2 > b.length && (this.min -= .5, this.max += .5), d || c || this.adjustTickAmount());
				k(this, "afterSetTickPositions")
			},
			trimTicks: function(a, b, d) {
				var g = a[0],
					c = a[a.length - 1],
					m = this.minPointOffset || 0;
				if(!this.isLinked) {
					if(b && -Infinity !== g) this.min = g;
					else
						for(; this.min - m > a[0];) a.shift();
					if(d) this.max = c;
					else
						for(; this.max + m < a[a.length - 1];) a.pop();
					0 === a.length && y(g) && !this.options.tickPositions && a.push((c + g) / 2)
				}
			},
			alignToOthers: function() {
				var a = {},
					b, d = this.options;
				!1 === this.chart.options.chart.alignTicks || !1 === d.alignTicks || !1 === d.startOnTick || !1 === d.endOnTick || this.isLog || f(this.chart[this.coll], function(g) {
					var d = g.options,
						d = [g.horiz ? d.left : d.top, d.width, d.height, d.pane].join();
					g.series.length && (a[d] ? b = !0 : a[d] = 1)
				});
				return b
			},
			getTickAmount: function() {
				var a = this.options,
					b = a.tickAmount,
					d = a.tickPixelInterval;
				!y(a.tickInterval) && this.len < d && !this.isRadial && !this.isLog && a.startOnTick && a.endOnTick && (b = 2);
				!b && this.alignToOthers() && (b = Math.ceil(this.len /
					d) + 1);
				4 > b && (this.finalTickAmt = b, b = 5);
				this.tickAmount = b
			},
			adjustTickAmount: function() {
				var a = this.tickInterval,
					b = this.tickPositions,
					d = this.tickAmount,
					c = this.finalTickAmt,
					m = b && b.length,
					l = H(this.threshold, this.softThreshold ? 0 : null);
				if(this.hasData()) {
					if(m < d) {
						for(; b.length < d;) b.length % 2 || this.min === l ? b.push(e(b[b.length - 1] + a)) : b.unshift(e(b[0] - a));
						this.transA *= (m - 1) / (d - 1);
						this.min = b[0];
						this.max = b[b.length - 1]
					} else m > d && (this.tickInterval *= 2, this.setTickPositions());
					if(y(c)) {
						for(a = d = b.length; a--;)(3 === c &&
							1 === a % 2 || 2 >= c && 0 < a && a < d - 1) && b.splice(a, 1);
						this.finalTickAmt = void 0
					}
				}
			},
			setScale: function() {
				var a, b;
				this.oldMin = this.min;
				this.oldMax = this.max;
				this.oldAxisLength = this.len;
				this.setAxisSize();
				b = this.len !== this.oldAxisLength;
				f(this.series, function(b) {
					if(b.isDirtyData || b.isDirty || b.xAxis.isDirty) a = !0
				});
				b || a || this.isLinked || this.forceRedraw || this.userMin !== this.oldUserMin || this.userMax !== this.oldUserMax || this.alignToOthers() ? (this.resetStacks && this.resetStacks(), this.forceRedraw = !1, this.getSeriesExtremes(),
					this.setTickInterval(), this.oldUserMin = this.userMin, this.oldUserMax = this.userMax, this.isDirty || (this.isDirty = b || this.min !== this.oldMin || this.max !== this.oldMax)) : this.cleanStacks && this.cleanStacks();
				k(this, "afterSetScale")
			},
			setExtremes: function(a, b, d, m, l) {
				var g = this,
					p = g.chart;
				d = H(d, !0);
				f(g.series, function(a) {
					delete a.kdTree
				});
				l = c(l, {
					min: a,
					max: b
				});
				k(g, "setExtremes", l, function() {
					g.userMin = a;
					g.userMax = b;
					g.eventArgs = l;
					d && p.redraw(m)
				})
			},
			zoom: function(a, b) {
				var g = this.dataMin,
					d = this.dataMax,
					c = this.options,
					m = Math.min(g, H(c.min, g)),
					c = Math.max(d, H(c.max, d));
				if(a !== this.min || b !== this.max) this.allowZoomOutside || (y(g) && (a < m && (a = m), a > c && (a = c)), y(d) && (b < m && (b = m), b > c && (b = c))), this.displayBtn = void 0 !== a || void 0 !== b, this.setExtremes(a, b, !1, void 0, {
					trigger: "zoom"
				});
				return !0
			},
			setAxisSize: function() {
				var b = this.chart,
					d = this.options,
					c = d.offsets || [0, 0, 0, 0],
					m = this.horiz,
					l = this.width = Math.round(a.relativeLength(H(d.width, b.plotWidth - c[3] + c[1]), b.plotWidth)),
					f = this.height = Math.round(a.relativeLength(H(d.height, b.plotHeight -
						c[0] + c[2]), b.plotHeight)),
					p = this.top = Math.round(a.relativeLength(H(d.top, b.plotTop + c[0]), b.plotHeight, b.plotTop)),
					d = this.left = Math.round(a.relativeLength(H(d.left, b.plotLeft + c[3]), b.plotWidth, b.plotLeft));
				this.bottom = b.chartHeight - f - p;
				this.right = b.chartWidth - l - d;
				this.len = Math.max(m ? l : f, 0);
				this.pos = m ? d : p
			},
			getExtremes: function() {
				var a = this.isLog;
				return {
					min: a ? e(this.lin2log(this.min)) : this.min,
					max: a ? e(this.lin2log(this.max)) : this.max,
					dataMin: this.dataMin,
					dataMax: this.dataMax,
					userMin: this.userMin,
					userMax: this.userMax
				}
			},
			getThreshold: function(a) {
				var b = this.isLog,
					g = b ? this.lin2log(this.min) : this.min,
					b = b ? this.lin2log(this.max) : this.max;
				null === a || -Infinity === a ? a = g : Infinity === a ? a = b : g > a ? a = g : b < a && (a = b);
				return this.translate(a, 0, 1, 0, 1)
			},
			autoLabelAlign: function(a) {
				a = (H(a, 0) - 90 * this.side + 720) % 360;
				return 15 < a && 165 > a ? "right" : 195 < a && 345 > a ? "left" : "center"
			},
			tickSize: function(a) {
				var b = this.options,
					g = b[a + "Length"],
					d = H(b[a + "Width"], "tick" === a && this.isXAxis ? 1 : 0);
				if(d && g) return "inside" === b[a + "Position"] && (g = -g), [g, d]
			},
			labelMetrics: function() {
				var a =
					this.tickPositions && this.tickPositions[0] || 0;
				return this.chart.renderer.fontMetrics(this.options.labels.style && this.options.labels.style.fontSize, this.ticks[a] && this.ticks[a].label)
			},
			unsquish: function() {
				var a = this.options.labels,
					b = this.horiz,
					d = this.tickInterval,
					c = d,
					m = this.len / (((this.categories ? 1 : 0) + this.max - this.min) / d),
					l, p = a.rotation,
					k = this.labelMetrics(),
					v, B = Number.MAX_VALUE,
					t, r = function(a) {
						a /= m || 1;
						a = 1 < a ? Math.ceil(a) : 1;
						return e(a * d)
					};
				b ? (t = !a.staggerLines && !a.step && (y(p) ? [p] : m < H(a.autoRotationLimit,
					80) && a.autoRotation)) && f(t, function(a) {
					var b;
					if(a === p || a && -90 <= a && 90 >= a) v = r(Math.abs(k.h / Math.sin(q * a))), b = v + Math.abs(a / 360), b < B && (B = b, l = a, c = v)
				}) : a.step || (c = r(k.h));
				this.autoRotation = t;
				this.labelRotation = H(l, p);
				return c
			},
			getSlotWidth: function() {
				var a = this.chart,
					b = this.horiz,
					d = this.options.labels,
					c = Math.max(this.tickPositions.length - (this.categories ? 0 : 1), 1),
					m = a.margin[3];
				return b && 2 > (d.step || 0) && !d.rotation && (this.staggerLines || 1) * this.len / c || !b && (d.style && parseInt(d.style.width, 10) || m && m - a.spacing[3] ||
					.33 * a.chartWidth)
			},
			renderUnsquish: function() {
				var a = this.chart,
					b = a.renderer,
					d = this.tickPositions,
					c = this.ticks,
					m = this.options.labels,
					l = m && m.style || {},
					p = this.horiz,
					k = this.getSlotWidth(),
					v = Math.max(1, Math.round(k - 2 * (m.padding || 5))),
					B = {},
					e = this.labelMetrics(),
					t = m.style && m.style.textOverflow,
					r, D, h = 0,
					A;
				I(m.rotation) || (B.rotation = m.rotation || 0);
				f(d, function(a) {
					(a = c[a]) && a.label && a.label.textPxLength > h && (h = a.label.textPxLength)
				});
				this.maxLabelLength = h;
				if(this.autoRotation) h > v && h > e.h ? B.rotation = this.labelRotation :
					this.labelRotation = 0;
				else if(k && (r = v, !t))
					for(D = "clip", v = d.length; !p && v--;)
						if(A = d[v], A = c[A].label) A.styles && "ellipsis" === A.styles.textOverflow ? A.css({
							textOverflow: "clip"
						}) : A.textPxLength > k && A.css({
							width: k + "px"
						}), A.getBBox().height > this.len / d.length - (e.h - e.f) && (A.specificTextOverflow = "ellipsis");
				B.rotation && (r = h > .5 * a.chartHeight ? .33 * a.chartHeight : a.chartHeight, t || (D = "ellipsis"));
				if(this.labelAlign = m.align || this.autoLabelAlign(this.labelRotation)) B.align = this.labelAlign;
				f(d, function(a) {
					var b = (a = c[a]) &&
						a.label,
						g = l.width,
						d = {};
					b && (b.attr(B), r && !g && "nowrap" !== l.whiteSpace && (r < b.textPxLength || "SPAN" === b.element.tagName) ? (d.width = r, t || (d.textOverflow = b.specificTextOverflow || D), b.css(d)) : b.styles && b.styles.width && !d.width && !g && b.css({
						width: null
					}), delete b.specificTextOverflow, a.rotation = B.rotation)
				});
				this.tickRotCorr = b.rotCorr(e.b, this.labelRotation || 0, 0 !== this.side)
			},
			hasData: function() {
				return this.hasVisibleSeries || y(this.min) && y(this.max) && this.tickPositions && 0 < this.tickPositions.length
			},
			addTitle: function(a) {
				var b =
					this.chart.renderer,
					g = this.horiz,
					d = this.opposite,
					c = this.options.title,
					m;
				this.axisTitle || ((m = c.textAlign) || (m = (g ? {
					low: "left",
					middle: "center",
					high: "right"
				} : {
					low: d ? "right" : "left",
					middle: "center",
					high: d ? "left" : "right"
				})[c.align]), this.axisTitle = b.text(c.text, 0, 0, c.useHTML).attr({
					zIndex: 7,
					rotation: c.rotation || 0,
					align: m
				}).addClass("highcharts-axis-title").css(t(c.style)).add(this.axisGroup), this.axisTitle.isNew = !0);
				c.style.width || this.isRadial || this.axisTitle.css({
					width: this.len
				});
				this.axisTitle[a ? "show" :
					"hide"](!0)
			},
			generateTick: function(a) {
				var b = this.ticks;
				b[a] ? b[a].addLabel() : b[a] = new M(this, a)
			},
			getOffset: function() {
				var a = this,
					b = a.chart,
					d = b.renderer,
					c = a.options,
					m = a.tickPositions,
					l = a.ticks,
					p = a.horiz,
					k = a.side,
					v = b.inverted && !a.isZAxis ? [1, 0, 3, 2][k] : k,
					B, e, t = 0,
					r, D = 0,
					h = c.title,
					G = c.labels,
					I = 0,
					x = b.axisOffset,
					b = b.clipOffset,
					q = [-1, 1, 1, -1][k],
					M = c.className,
					u = a.axisParent,
					n = this.tickSize("tick");
				B = a.hasData();
				a.showAxis = e = B || H(c.showEmpty, !0);
				a.staggerLines = a.horiz && G.staggerLines;
				a.axisGroup || (a.gridGroup =
					d.g("grid").attr({
						zIndex: c.gridZIndex || 1
					}).addClass("highcharts-" + this.coll.toLowerCase() + "-grid " + (M || "")).add(u), a.axisGroup = d.g("axis").attr({
						zIndex: c.zIndex || 2
					}).addClass("highcharts-" + this.coll.toLowerCase() + " " + (M || "")).add(u), a.labelGroup = d.g("axis-labels").attr({
						zIndex: G.zIndex || 7
					}).addClass("highcharts-" + a.coll.toLowerCase() + "-labels " + (M || "")).add(u));
				B || a.isLinked ? (f(m, function(b, g) {
						a.generateTick(b, g)
					}), a.renderUnsquish(), a.reserveSpaceDefault = 0 === k || 2 === k || {
						1: "left",
						3: "right"
					}[k] === a.labelAlign,
					H(G.reserveSpace, "center" === a.labelAlign ? !0 : null, a.reserveSpaceDefault) && f(m, function(a) {
						I = Math.max(l[a].getLabelSize(), I)
					}), a.staggerLines && (I *= a.staggerLines), a.labelOffset = I * (a.opposite ? -1 : 1)) : A(l, function(a, b) {
					a.destroy();
					delete l[b]
				});
				h && h.text && !1 !== h.enabled && (a.addTitle(e), e && !1 !== h.reserveSpace && (a.titleOffset = t = a.axisTitle.getBBox()[p ? "height" : "width"], r = h.offset, D = y(r) ? 0 : H(h.margin, p ? 5 : 10)));
				a.renderLine();
				a.offset = q * H(c.offset, x[k]);
				a.tickRotCorr = a.tickRotCorr || {
					x: 0,
					y: 0
				};
				d = 0 === k ? -a.labelMetrics().h :
					2 === k ? a.tickRotCorr.y : 0;
				D = Math.abs(I) + D;
				I && (D = D - d + q * (p ? H(G.y, a.tickRotCorr.y + 8 * q) : G.x));
				a.axisTitleMargin = H(r, D);
				x[k] = Math.max(x[k], a.axisTitleMargin + t + q * a.offset, D, B && m.length && n ? n[0] + q * a.offset : 0);
				c = c.offset ? 0 : 2 * Math.floor(a.axisLine.strokeWidth() / 2);
				b[v] = Math.max(b[v], c)
			},
			getLinePath: function(a) {
				var b = this.chart,
					g = this.opposite,
					d = this.offset,
					c = this.horiz,
					m = this.left + (g ? this.width : 0) + d,
					d = b.chartHeight - this.bottom - (g ? this.height : 0) + d;
				g && (a *= -1);
				return b.renderer.crispLine(["M", c ? this.left : m, c ? d :
					this.top, "L", c ? b.chartWidth - this.right : m, c ? d : b.chartHeight - this.bottom
				], a)
			},
			renderLine: function() {
				this.axisLine || (this.axisLine = this.chart.renderer.path().addClass("highcharts-axis-line").add(this.axisGroup), this.axisLine.attr({
					stroke: this.options.lineColor,
					"stroke-width": this.options.lineWidth,
					zIndex: 7
				}))
			},
			getTitlePosition: function() {
				var a = this.horiz,
					b = this.left,
					d = this.top,
					c = this.len,
					m = this.options.title,
					l = a ? b : d,
					f = this.opposite,
					p = this.offset,
					k = m.x || 0,
					v = m.y || 0,
					B = this.axisTitle,
					e = this.chart.renderer.fontMetrics(m.style &&
						m.style.fontSize, B),
					B = Math.max(B.getBBox(null, 0).height - e.h - 1, 0),
					c = {
						low: l + (a ? 0 : c),
						middle: l + c / 2,
						high: l + (a ? c : 0)
					}[m.align],
					b = (a ? d + this.height : b) + (a ? 1 : -1) * (f ? -1 : 1) * this.axisTitleMargin + [-B, B, e.f, -B][this.side];
				return {
					x: a ? c + k : b + (f ? this.width : 0) + p + k,
					y: a ? b + v - (f ? this.height : 0) + p : c + v
				}
			},
			renderMinorTick: function(a) {
				var b = this.chart.hasRendered && p(this.oldMin),
					d = this.minorTicks;
				d[a] || (d[a] = new M(this, a, "minor"));
				b && d[a].isNew && d[a].render(null, !0);
				d[a].render(null, !1, 1)
			},
			renderTick: function(a, b) {
				var d = this.isLinked,
					g = this.ticks,
					c = this.chart.hasRendered && p(this.oldMin);
				if(!d || a >= this.min && a <= this.max) g[a] || (g[a] = new M(this, a)), c && g[a].isNew && g[a].render(b, !0, .1), g[a].render(b)
			},
			render: function() {
				var b = this,
					d = b.chart,
					c = b.options,
					m = b.isLog,
					l = b.isLinked,
					v = b.tickPositions,
					e = b.axisTitle,
					t = b.ticks,
					r = b.minorTicks,
					D = b.alternateBands,
					h = c.stackLabels,
					G = c.alternateGridColor,
					I = b.tickmarkOffset,
					x = b.axisLine,
					q = b.showAxis,
					H = E(d.renderer.globalAnimation),
					u, n;
				b.labelEdge.length = 0;
				b.overlap = !1;
				f([t, r, D], function(a) {
					A(a, function(a) {
						a.isActive = !1
					})
				});
				if(b.hasData() || l) b.minorTickInterval && !b.categories && f(b.getMinorTickPositions(), function(a) {
						b.renderMinorTick(a)
					}), v.length && (f(v, function(a, d) {
						b.renderTick(a, d)
					}), I && (0 === b.min || b.single) && (t[-1] || (t[-1] = new M(b, -1, null, !0)), t[-1].render(-1))), G && f(v, function(c, g) {
						n = void 0 !== v[g + 1] ? v[g + 1] + I : b.max - I;
						0 === g % 2 && c < b.max && n <= b.max + (d.polar ? -I : I) && (D[c] || (D[c] = new a.PlotLineOrBand(b)), u = c + I, D[c].options = {
							from: m ? b.lin2log(u) : u,
							to: m ? b.lin2log(n) : n,
							color: G
						}, D[c].render(), D[c].isActive = !0)
					}), b._addedPlotLB ||
					(f((c.plotLines || []).concat(c.plotBands || []), function(a) {
						b.addPlotBandOrLine(a)
					}), b._addedPlotLB = !0);
				f([t, r, D], function(a) {
					var b, c = [],
						g = H.duration;
					A(a, function(a, b) {
						a.isActive || (a.render(b, !1, 0), a.isActive = !1, c.push(b))
					});
					B(function() {
						for(b = c.length; b--;) a[c[b]] && !a[c[b]].isActive && (a[c[b]].destroy(), delete a[c[b]])
					}, a !== D && d.hasRendered && g ? g : 0)
				});
				x && (x[x.isPlaced ? "animate" : "attr"]({
					d: this.getLinePath(x.strokeWidth())
				}), x.isPlaced = !0, x[q ? "show" : "hide"](!0));
				e && q && (c = b.getTitlePosition(), p(c.y) ? (e[e.isNew ?
					"attr" : "animate"](c), e.isNew = !1) : (e.attr("y", -9999), e.isNew = !0));
				h && h.enabled && b.renderStackTotals();
				b.isDirty = !1;
				k(this, "afterRender")
			},
			redraw: function() {
				this.visible && (this.render(), f(this.plotLinesAndBands, function(a) {
					a.render()
				}));
				f(this.series, function(a) {
					a.isDirty = !0
				})
			},
			keepProps: "extKey hcEvents names series userMax userMin".split(" "),
			destroy: function(a) {
				var d = this,
					c = d.stacks,
					g = d.plotLinesAndBands,
					l;
				k(this, "destroy", {
					keepEvents: a
				});
				a || m(d);
				A(c, function(a, b) {
					x(a);
					c[b] = null
				});
				f([d.ticks, d.minorTicks,
					d.alternateBands
				], function(a) {
					x(a)
				});
				if(g)
					for(a = g.length; a--;) g[a].destroy();
				f("stackTotalGroup axisLine axisTitle axisGroup gridGroup labelGroup cross".split(" "), function(a) {
					d[a] && (d[a] = d[a].destroy())
				});
				for(l in d.plotLinesAndBandsGroups) d.plotLinesAndBandsGroups[l] = d.plotLinesAndBandsGroups[l].destroy();
				A(d, function(a, c) {
					-1 === b(c, d.keepProps) && delete d[c]
				})
			},
			drawCrosshair: function(a, b) {
				var d, c = this.crosshair,
					g = H(c.snap, !0),
					m, l = this.cross;
				k(this, "drawCrosshair", {
					e: a,
					point: b
				});
				a || (a = this.cross &&
					this.cross.e);
				if(this.crosshair && !1 !== (y(b) || !g)) {
					g ? y(b) && (m = H(b.crosshairPos, this.isXAxis ? b.plotX : this.len - b.plotY)) : m = a && (this.horiz ? a.chartX - this.pos : this.len - a.chartY + this.pos);
					y(m) && (d = this.getPlotLinePath(b && (this.isXAxis ? b.x : H(b.stackY, b.y)), null, null, null, m) || null);
					if(!y(d)) {
						this.hideCrosshair();
						return
					}
					g = this.categories && !this.isRadial;
					l || (this.cross = l = this.chart.renderer.path().addClass("highcharts-crosshair highcharts-crosshair-" + (g ? "category " : "thin ") + c.className).attr({
						zIndex: H(c.zIndex,
							2)
					}).add(), l.attr({
						stroke: c.color || (g ? h("#ccd6eb").setOpacity(.25).get() : "#cccccc"),
						"stroke-width": H(c.width, 1)
					}).css({
						"pointer-events": "none"
					}), c.dashStyle && l.attr({
						dashstyle: c.dashStyle
					}));
					l.show().attr({
						d: d
					});
					g && !c.width && l.attr({
						"stroke-width": this.transA
					});
					this.cross.e = a
				} else this.hideCrosshair();
				k(this, "afterDrawCrosshair", {
					e: a,
					point: b
				})
			},
			hideCrosshair: function() {
				this.cross && this.cross.hide()
			}
		});
		return a.Axis = G
	}(K);
	(function(a) {
		var C = a.Axis,
			E = a.getMagnitude,
			F = a.normalizeTickInterval,
			n = a.timeUnits;
		C.prototype.getTimeTicks = function() {
			return this.chart.time.getTimeTicks.apply(this.chart.time, arguments)
		};
		C.prototype.normalizeTimeTickInterval = function(a, e) {
			var h = e || [
				["millisecond", [1, 2, 5, 10, 20, 25, 50, 100, 200, 500]],
				["second", [1, 2, 5, 10, 15, 30]],
				["minute", [1, 2, 5, 10, 15, 30]],
				["hour", [1, 2, 3, 4, 6, 8, 12]],
				["day", [1, 2]],
				["week", [1, 2]],
				["month", [1, 2, 3, 4, 6]],
				["year", null]
			];
			e = h[h.length - 1];
			var y = n[e[0]],
				q = e[1],
				x;
			for(x = 0; x < h.length && !(e = h[x], y = n[e[0]], q = e[1], h[x + 1] && a <= (y * q[q.length - 1] + n[h[x + 1][0]]) / 2); x++);
			y ===
				n.year && a < 5 * y && (q = [1, 2, 5]);
			a = F(a / y, q, "year" === e[0] ? Math.max(E(a / y), 1) : 1);
			return {
				unitRange: y,
				count: a,
				unitName: e[0]
			}
		}
	})(K);
	(function(a) {
		var C = a.Axis,
			E = a.getMagnitude,
			F = a.map,
			n = a.normalizeTickInterval,
			h = a.pick;
		C.prototype.getLogTickPositions = function(a, u, y, q) {
			var e = this.options,
				f = this.len,
				c = [];
			q || (this._minorAutoInterval = null);
			if(.5 <= a) a = Math.round(a), c = this.getLinearTickPositions(a, u, y);
			else if(.08 <= a)
				for(var f = Math.floor(u), k, r, l, d, b, e = .3 < a ? [1, 2, 4] : .15 < a ? [1, 2, 4, 6, 8] : [1, 2, 3, 4, 5, 6, 7, 8, 9]; f < y + 1 && !b; f++)
					for(r =
						e.length, k = 0; k < r && !b; k++) l = this.log2lin(this.lin2log(f) * e[k]), l > u && (!q || d <= y) && void 0 !== d && c.push(d), d > y && (b = !0), d = l;
			else u = this.lin2log(u), y = this.lin2log(y), a = q ? this.getMinorTickInterval() : e.tickInterval, a = h("auto" === a ? null : a, this._minorAutoInterval, e.tickPixelInterval / (q ? 5 : 1) * (y - u) / ((q ? f / this.tickPositions.length : f) || 1)), a = n(a, null, E(a)), c = F(this.getLinearTickPositions(a, u, y), this.log2lin), q || (this._minorAutoInterval = a / 5);
			q || (this.tickInterval = a);
			return c
		};
		C.prototype.log2lin = function(a) {
			return Math.log(a) /
				Math.LN10
		};
		C.prototype.lin2log = function(a) {
			return Math.pow(10, a)
		}
	})(K);
	(function(a, C) {
		var E = a.arrayMax,
			F = a.arrayMin,
			n = a.defined,
			h = a.destroyObjectProperties,
			e = a.each,
			u = a.erase,
			y = a.merge,
			q = a.pick;
		a.PlotLineOrBand = function(a, f) {
			this.axis = a;
			f && (this.options = f, this.id = f.id)
		};
		a.PlotLineOrBand.prototype = {
			render: function() {
				var e = this,
					f = e.axis,
					c = f.horiz,
					k = e.options,
					r = k.label,
					l = e.label,
					d = k.to,
					b = k.from,
					v = k.value,
					p = n(b) && n(d),
					h = n(v),
					t = e.svgElem,
					u = !t,
					A = [],
					H = k.color,
					m = q(k.zIndex, 0),
					D = k.events,
					A = {
						"class": "highcharts-plot-" +
							(p ? "band " : "line ") + (k.className || "")
					},
					B = {},
					M = f.chart.renderer,
					G = p ? "bands" : "lines";
				f.isLog && (b = f.log2lin(b), d = f.log2lin(d), v = f.log2lin(v));
				h ? (A.stroke = H, A["stroke-width"] = k.width, k.dashStyle && (A.dashstyle = k.dashStyle)) : p && (H && (A.fill = H), k.borderWidth && (A.stroke = k.borderColor, A["stroke-width"] = k.borderWidth));
				B.zIndex = m;
				G += "-" + m;
				(H = f.plotLinesAndBandsGroups[G]) || (f.plotLinesAndBandsGroups[G] = H = M.g("plot-" + G).attr(B).add());
				u && (e.svgElem = t = M.path().attr(A).add(H));
				if(h) A = f.getPlotLinePath(v, t.strokeWidth());
				else if(p) A = f.getPlotBandPath(b, d, k);
				else return;
				u && A && A.length ? (t.attr({
					d: A
				}), D && a.objectEach(D, function(a, b) {
					t.on(b, function(a) {
						D[b].apply(e, [a])
					})
				})) : t && (A ? (t.show(), t.animate({
					d: A
				})) : (t.hide(), l && (e.label = l = l.destroy())));
				r && n(r.text) && A && A.length && 0 < f.width && 0 < f.height && !A.isFlat ? (r = y({
					align: c && p && "center",
					x: c ? !p && 4 : 10,
					verticalAlign: !c && p && "middle",
					y: c ? p ? 16 : 10 : p ? 6 : -4,
					rotation: c && !p && 90
				}, r), this.renderLabel(r, A, p, m)) : l && l.hide();
				return e
			},
			renderLabel: function(a, f, c, k) {
				var e = this.label,
					l = this.axis.chart.renderer;
				e || (e = {
					align: a.textAlign || a.align,
					rotation: a.rotation,
					"class": "highcharts-plot-" + (c ? "band" : "line") + "-label " + (a.className || "")
				}, e.zIndex = k, this.label = e = l.text(a.text, 0, 0, a.useHTML).attr(e).add(), e.css(a.style));
				k = f.xBounds || [f[1], f[4], c ? f[6] : f[1]];
				f = f.yBounds || [f[2], f[5], c ? f[7] : f[2]];
				c = F(k);
				l = F(f);
				e.align(a, !1, {
					x: c,
					y: l,
					width: E(k) - c,
					height: E(f) - l
				});
				e.show()
			},
			destroy: function() {
				u(this.axis.plotLinesAndBands, this);
				delete this.axis;
				h(this)
			}
		};
		a.extend(C.prototype, {
			getPlotBandPath: function(a, f) {
				var c = this.getPlotLinePath(f,
						null, null, !0),
					k = this.getPlotLinePath(a, null, null, !0),
					e = [],
					l = this.horiz,
					d = 1,
					b;
				a = a < this.min && f < this.min || a > this.max && f > this.max;
				if(k && c)
					for(a && (b = k.toString() === c.toString(), d = 0), a = 0; a < k.length; a += 6) l && c[a + 1] === k[a + 1] ? (c[a + 1] += d, c[a + 4] += d) : l || c[a + 2] !== k[a + 2] || (c[a + 2] += d, c[a + 5] += d), e.push("M", k[a + 1], k[a + 2], "L", k[a + 4], k[a + 5], c[a + 4], c[a + 5], c[a + 1], c[a + 2], "z"), e.isFlat = b;
				return e
			},
			addPlotBand: function(a) {
				return this.addPlotBandOrLine(a, "plotBands")
			},
			addPlotLine: function(a) {
				return this.addPlotBandOrLine(a,
					"plotLines")
			},
			addPlotBandOrLine: function(e, f) {
				var c = (new a.PlotLineOrBand(this, e)).render(),
					k = this.userOptions;
				c && (f && (k[f] = k[f] || [], k[f].push(e)), this.plotLinesAndBands.push(c));
				return c
			},
			removePlotBandOrLine: function(a) {
				for(var f = this.plotLinesAndBands, c = this.options, k = this.userOptions, r = f.length; r--;) f[r].id === a && f[r].destroy();
				e([c.plotLines || [], k.plotLines || [], c.plotBands || [], k.plotBands || []], function(c) {
					for(r = c.length; r--;) c[r].id === a && u(c, c[r])
				})
			},
			removePlotBand: function(a) {
				this.removePlotBandOrLine(a)
			},
			removePlotLine: function(a) {
				this.removePlotBandOrLine(a)
			}
		})
	})(K, V);
	(function(a) {
		var C = a.doc,
			E = a.each,
			F = a.extend,
			n = a.format,
			h = a.isNumber,
			e = a.map,
			u = a.merge,
			y = a.pick,
			q = a.splat,
			x = a.syncTimeout,
			f = a.timeUnits;
		a.Tooltip = function() {
			this.init.apply(this, arguments)
		};
		a.Tooltip.prototype = {
			init: function(a, f) {
				this.chart = a;
				this.options = f;
				this.crosshairs = [];
				this.now = {
					x: 0,
					y: 0
				};
				this.isHidden = !0;
				this.split = f.split && !a.inverted;
				this.shared = f.shared || this.split;
				this.outside = f.outside && !this.split
			},
			cleanSplit: function(a) {
				E(this.chart.series,
					function(c) {
						var f = c && c.tt;
						f && (!f.isActive || a ? c.tt = f.destroy() : f.isActive = !1)
					})
			},
			getLabel: function() {
				var c = this.chart.renderer,
					f = this.options,
					e;
				this.label || (this.outside && (this.container = e = a.doc.createElement("div"), e.className = "highcharts-tooltip-container", a.css(e, {
					position: "absolute",
					top: "1px",
					pointerEvents: "none"
				}), a.doc.body.appendChild(e), this.renderer = c = new a.Renderer(e, 0, 0)), this.split ? this.label = c.g("tooltip") : (this.label = c.label("", 0, 0, f.shape || "callout", null, null, f.useHTML, null, "tooltip").attr({
					padding: f.padding,
					r: f.borderRadius
				}), this.label.attr({
					fill: f.backgroundColor,
					"stroke-width": f.borderWidth
				}).css(f.style).shadow(f.shadow)), this.outside && (this.label.attr({
					x: this.distance,
					y: this.distance
				}), this.label.xSetter = function(a) {
					e.style.left = a + "px"
				}, this.label.ySetter = function(a) {
					e.style.top = a + "px"
				}), this.label.attr({
					zIndex: 8
				}).add());
				return this.label
			},
			update: function(a) {
				this.destroy();
				u(!0, this.chart.options.tooltip.userOptions, a);
				this.init(this.chart, u(!0, this.options, a))
			},
			destroy: function() {
				this.label &&
					(this.label = this.label.destroy());
				this.split && this.tt && (this.cleanSplit(this.chart, !0), this.tt = this.tt.destroy());
				this.renderer && (this.renderer = this.renderer.destroy(), a.discardElement(this.container));
				a.clearTimeout(this.hideTimer);
				a.clearTimeout(this.tooltipTimeout)
			},
			move: function(c, f, e, l) {
				var d = this,
					b = d.now,
					v = !1 !== d.options.animation && !d.isHidden && (1 < Math.abs(c - b.x) || 1 < Math.abs(f - b.y)),
					p = d.followPointer || 1 < d.len;
				F(b, {
					x: v ? (2 * b.x + c) / 3 : c,
					y: v ? (b.y + f) / 2 : f,
					anchorX: p ? void 0 : v ? (2 * b.anchorX + e) / 3 : e,
					anchorY: p ?
						void 0 : v ? (b.anchorY + l) / 2 : l
				});
				d.getLabel().attr(b);
				v && (a.clearTimeout(this.tooltipTimeout), this.tooltipTimeout = setTimeout(function() {
					d && d.move(c, f, e, l)
				}, 32))
			},
			hide: function(c) {
				var f = this;
				a.clearTimeout(this.hideTimer);
				c = y(c, this.options.hideDelay, 500);
				this.isHidden || (this.hideTimer = x(function() {
					f.getLabel()[c ? "fadeOut" : "hide"]();
					f.isHidden = !0
				}, c))
			},
			getAnchor: function(a, f) {
				var c, l = this.chart,
					d = l.inverted,
					b = l.plotTop,
					v = l.plotLeft,
					p = 0,
					k = 0,
					t, h;
				a = q(a);
				c = a[0].tooltipPos;
				this.followPointer && f && (void 0 ===
					f.chartX && (f = l.pointer.normalize(f)), c = [f.chartX - l.plotLeft, f.chartY - b]);
				c || (E(a, function(a) {
					t = a.series.yAxis;
					h = a.series.xAxis;
					p += a.plotX + (!d && h ? h.left - v : 0);
					k += (a.plotLow ? (a.plotLow + a.plotHigh) / 2 : a.plotY) + (!d && t ? t.top - b : 0)
				}), p /= a.length, k /= a.length, c = [d ? l.plotWidth - k : p, this.shared && !d && 1 < a.length && f ? f.chartY - b : d ? l.plotHeight - p : k]);
				return e(c, Math.round)
			},
			getPosition: function(a, f, e) {
				var c = this.chart,
					d = this.distance,
					b = {},
					v = c.inverted && e.h || 0,
					p, k = this.outside,
					t = k ? C.documentElement.clientWidth - 2 * d : c.chartWidth,
					h = k ? Math.max(C.body.scrollHeight, C.documentElement.scrollHeight, C.body.offsetHeight, C.documentElement.offsetHeight, C.documentElement.clientHeight) : c.chartHeight,
					A = c.pointer.chartPosition,
					r = ["y", h, f, (k ? A.top - d : 0) + e.plotY + c.plotTop, k ? 0 : c.plotTop, k ? h : c.plotTop + c.plotHeight],
					m = ["x", t, a, (k ? A.left - d : 0) + e.plotX + c.plotLeft, k ? 0 : c.plotLeft, k ? t : c.plotLeft + c.plotWidth],
					D = !this.followPointer && y(e.ttBelow, !c.inverted === !!e.negative),
					B = function(a, c, g, m, l, f) {
						var p = g < m - d,
							e = m + d + g < c,
							B = m - d - g;
						m += d;
						if(D && e) b[a] = m;
						else if(!D &&
							p) b[a] = B;
						else if(p) b[a] = Math.min(f - g, 0 > B - v ? B : B - v);
						else if(e) b[a] = Math.max(l, m + v + g > c ? m : m + v);
						else return !1
					},
					q = function(a, c, g, m) {
						var l;
						m < d || m > c - d ? l = !1 : b[a] = m < g / 2 ? 1 : m > c - g / 2 ? c - g - 2 : m - g / 2;
						return l
					},
					G = function(a) {
						var b = r;
						r = m;
						m = b;
						p = a
					},
					g = function() {
						!1 !== B.apply(0, r) ? !1 !== q.apply(0, m) || p || (G(!0), g()) : p ? b.x = b.y = 0 : (G(!0), g())
					};
				(c.inverted || 1 < this.len) && G();
				g();
				return b
			},
			defaultFormatter: function(a) {
				var c = this.points || q(this),
					f;
				f = [a.tooltipFooterHeaderFormatter(c[0])];
				f = f.concat(a.bodyFormatter(c));
				f.push(a.tooltipFooterHeaderFormatter(c[0], !0));
				return f
			},
			refresh: function(c, f) {
				var e, l = this.options,
					d, b = c,
					v, p = {},
					k = [];
				e = l.formatter || this.defaultFormatter;
				var p = this.shared,
					t;
				l.enabled && (a.clearTimeout(this.hideTimer), this.followPointer = q(b)[0].series.tooltipOptions.followPointer, v = this.getAnchor(b, f), f = v[0], d = v[1], !p || b.series && b.series.noSharedTooltip ? p = b.getLabelConfig() : (E(b, function(a) {
						a.setState("hover");
						k.push(a.getLabelConfig())
					}), p = {
						x: b[0].category,
						y: b[0].y
					}, p.points = k, b = b[0]), this.len = k.length, p = e.call(p, this), t = b.series, this.distance =
					y(t.tooltipOptions.distance, 16), !1 === p ? this.hide() : (e = this.getLabel(), this.isHidden && e.attr({
						opacity: 1
					}).show(), this.split ? this.renderSplit(p, q(c)) : (l.style.width || e.css({
						width: this.chart.spacingBox.width
					}), e.attr({
						text: p && p.join ? p.join("") : p
					}), e.removeClass(/highcharts-color-[\d]+/g).addClass("highcharts-color-" + y(b.colorIndex, t.colorIndex)), e.attr({
						stroke: l.borderColor || b.color || t.color || "#666666"
					}), this.updatePosition({
						plotX: f,
						plotY: d,
						negative: b.negative,
						ttBelow: b.ttBelow,
						h: v[2] || 0
					})), this.isHidden = !1))
			},
			renderSplit: function(c, f) {
				var e = this,
					l = [],
					d = this.chart,
					b = d.renderer,
					v = !0,
					p = this.options,
					k = 0,
					t = this.getLabel();
				a.isString(c) && (c = [!1, c]);
				E(c.slice(0, f.length + 1), function(a, c) {
					if(!1 !== a) {
						c = f[c - 1] || {
							isHeader: !0,
							plotX: f[0].plotX
						};
						var h = c.series || e,
							m = h.tt,
							D = c.series || {},
							B = "highcharts-color-" + y(c.colorIndex, D.colorIndex, "none");
						m || (h.tt = m = b.label(null, null, null, "callout", null, null, p.useHTML).addClass("highcharts-tooltip-box " + B).attr({
							padding: p.padding,
							r: p.borderRadius,
							fill: p.backgroundColor,
							stroke: p.borderColor ||
								c.color || D.color || "#333333",
							"stroke-width": p.borderWidth
						}).add(t));
						m.isActive = !0;
						m.attr({
							text: a
						});
						m.css(p.style).shadow(p.shadow);
						a = m.getBBox();
						D = a.width + m.strokeWidth();
						c.isHeader ? (k = a.height, D = Math.max(0, Math.min(c.plotX + d.plotLeft - D / 2, d.chartWidth - D))) : D = c.plotX + d.plotLeft - y(p.distance, 16) - D;
						0 > D && (v = !1);
						a = (c.series && c.series.yAxis && c.series.yAxis.pos) + (c.plotY || 0);
						a -= d.plotTop;
						l.push({
							target: c.isHeader ? d.plotHeight + k : a,
							rank: c.isHeader ? 1 : 0,
							size: h.tt.getBBox().height + 1,
							point: c,
							x: D,
							tt: m
						})
					}
				});
				this.cleanSplit();
				a.distribute(l, d.plotHeight + k);
				E(l, function(a) {
					var b = a.point,
						c = b.series;
					a.tt.attr({
						visibility: void 0 === a.pos ? "hidden" : "inherit",
						x: v || b.isHeader ? a.x : b.plotX + d.plotLeft + y(p.distance, 16),
						y: a.pos + d.plotTop,
						anchorX: b.isHeader ? b.plotX + d.plotLeft : b.plotX + c.xAxis.pos,
						anchorY: b.isHeader ? a.pos + d.plotTop - 15 : b.plotY + c.yAxis.pos
					})
				})
			},
			updatePosition: function(a) {
				var c = this.chart,
					f = this.getLabel(),
					l = (this.options.positioner || this.getPosition).call(this, f.width, f.height, a),
					d = a.plotX + c.plotLeft;
				a = a.plotY + c.plotTop;
				var b;
				this.outside && (b = (this.options.borderWidth || 0) + 2 * this.distance, this.renderer.setSize(f.width + b, f.height + b, !1), d += c.pointer.chartPosition.left - l.x, a += c.pointer.chartPosition.top - l.y);
				this.move(Math.round(l.x), Math.round(l.y || 0), d, a)
			},
			getDateFormat: function(a, e, h, l) {
				var d = this.chart.time,
					b = d.dateFormat("%m-%d %H:%M:%S.%L", e),
					c, p, k = {
						millisecond: 15,
						second: 12,
						minute: 9,
						hour: 6,
						day: 3
					},
					t = "millisecond";
				for(p in f) {
					if(a === f.week && +d.dateFormat("%w", e) === h && "00:00:00.000" === b.substr(6)) {
						p = "week";
						break
					}
					if(f[p] >
						a) {
						p = t;
						break
					}
					if(k[p] && b.substr(k[p]) !== "01-01 00:00:00.000".substr(k[p])) break;
					"week" !== p && (t = p)
				}
				p && (c = l[p]);
				return c
			},
			getXDateFormat: function(a, f, e) {
				f = f.dateTimeLabelFormats;
				var c = e && e.closestPointRange;
				return(c ? this.getDateFormat(c, a.x, e.options.startOfWeek, f) : f.day) || f.year
			},
			tooltipFooterHeaderFormatter: function(a, f) {
				f = f ? "footer" : "header";
				var c = a.series,
					l = c.tooltipOptions,
					d = l.xDateFormat,
					b = c.xAxis,
					e = b && "datetime" === b.options.type && h(a.key),
					p = l[f + "Format"];
				e && !d && (d = this.getXDateFormat(a, l, b));
				e && d && E(a.point && a.point.tooltipDateKeys || ["key"], function(a) {
					p = p.replace("{point." + a + "}", "{point." + a + ":" + d + "}")
				});
				return n(p, {
					point: a,
					series: c
				}, this.chart.time)
			},
			bodyFormatter: function(a) {
				return e(a, function(a) {
					var c = a.series.tooltipOptions;
					return(c[(a.point.formatPrefix || "point") + "Formatter"] || a.point.tooltipFormatter).call(a.point, c[(a.point.formatPrefix || "point") + "Format"])
				})
			}
		}
	})(K);
	(function(a) {
		var C = a.addEvent,
			E = a.attr,
			F = a.charts,
			n = a.color,
			h = a.css,
			e = a.defined,
			u = a.each,
			y = a.extend,
			q = a.find,
			x =
			a.fireEvent,
			f = a.isNumber,
			c = a.isObject,
			k = a.offset,
			r = a.pick,
			l = a.splat,
			d = a.Tooltip;
		a.Pointer = function(a, d) {
			this.init(a, d)
		};
		a.Pointer.prototype = {
			init: function(a, c) {
				this.options = c;
				this.chart = a;
				this.runChartClick = c.chart.events && !!c.chart.events.click;
				this.pinchDown = [];
				this.lastValidTouch = {};
				d && (a.tooltip = new d(a, c.tooltip), this.followTouchMove = r(c.tooltip.followTouchMove, !0));
				this.setDOMEvents()
			},
			zoomOption: function(a) {
				var b = this.chart,
					d = b.options.chart,
					c = d.zoomType || "",
					b = b.inverted;
				/touch/.test(a.type) &&
					(c = r(d.pinchType, c));
				this.zoomX = a = /x/.test(c);
				this.zoomY = c = /y/.test(c);
				this.zoomHor = a && !b || c && b;
				this.zoomVert = c && !b || a && b;
				this.hasZoom = a || c
			},
			normalize: function(a, c) {
				var b;
				b = a.touches ? a.touches.length ? a.touches.item(0) : a.changedTouches[0] : a;
				c || (this.chartPosition = c = k(this.chart.container));
				return y(a, {
					chartX: Math.round(b.pageX - c.left),
					chartY: Math.round(b.pageY - c.top)
				})
			},
			getCoordinates: function(a) {
				var b = {
					xAxis: [],
					yAxis: []
				};
				u(this.chart.axes, function(c) {
					b[c.isXAxis ? "xAxis" : "yAxis"].push({
						axis: c,
						value: c.toValue(a[c.horiz ?
							"chartX" : "chartY"])
					})
				});
				return b
			},
			findNearestKDPoint: function(a, d, f) {
				var b;
				u(a, function(a) {
					var l = !(a.noSharedTooltip && d) && 0 > a.options.findNearestPointBy.indexOf("y");
					a = a.searchPoint(f, l);
					if((l = c(a, !0)) && !(l = !c(b, !0))) var l = b.distX - a.distX,
						e = b.dist - a.dist,
						p = (a.series.group && a.series.group.zIndex) - (b.series.group && b.series.group.zIndex),
						l = 0 < (0 !== l && d ? l : 0 !== e ? e : 0 !== p ? p : b.series.index > a.series.index ? -1 : 1);
					l && (b = a)
				});
				return b
			},
			getPointFromEvent: function(a) {
				a = a.target;
				for(var b; a && !b;) b = a.point, a = a.parentNode;
				return b
			},
			getChartCoordinatesFromPoint: function(a, c) {
				var b = a.series,
					d = b.xAxis,
					b = b.yAxis,
					f = r(a.clientX, a.plotX),
					l = a.shapeArgs;
				if(d && b) return c ? {
					chartX: d.len + d.pos - f,
					chartY: b.len + b.pos - a.plotY
				} : {
					chartX: f + d.pos,
					chartY: a.plotY + b.pos
				};
				if(l && l.x && l.y) return {
					chartX: l.x,
					chartY: l.y
				}
			},
			getHoverData: function(b, d, f, l, e, k, h) {
				var p, m = [],
					v = h && h.isBoosting;
				l = !(!l || !b);
				h = d && !d.stickyTracking ? [d] : a.grep(f, function(a) {
					return a.visible && !(!e && a.directTouch) && r(a.options.enableMouseTracking, !0) && a.stickyTracking
				});
				d = (p =
					l ? b : this.findNearestKDPoint(h, e, k)) && p.series;
				p && (e && !d.noSharedTooltip ? (h = a.grep(f, function(a) {
					return a.visible && !(!e && a.directTouch) && r(a.options.enableMouseTracking, !0) && !a.noSharedTooltip
				}), u(h, function(a) {
					var b = q(a.points, function(a) {
						return a.x === p.x && !a.isNull
					});
					c(b) && (v && (b = a.getPoint(b)), m.push(b))
				})) : m.push(p));
				return {
					hoverPoint: p,
					hoverSeries: d,
					hoverPoints: m
				}
			},
			runPointActions: function(b, d) {
				var c = this.chart,
					f = c.tooltip && c.tooltip.options.enabled ? c.tooltip : void 0,
					l = f ? f.shared : !1,
					e = d || c.hoverPoint,
					k = e && e.series || c.hoverSeries,
					k = this.getHoverData(e, k, c.series, !!d || k && k.directTouch && this.isDirectTouch, l, b, {
						isBoosting: c.isBoosting
					}),
					h, e = k.hoverPoint;
				h = k.hoverPoints;
				d = (k = k.hoverSeries) && k.tooltipOptions.followPointer;
				l = l && k && !k.noSharedTooltip;
				if(e && (e !== c.hoverPoint || f && f.isHidden)) {
					u(c.hoverPoints || [], function(b) {
						-1 === a.inArray(b, h) && b.setState()
					});
					u(h || [], function(a) {
						a.setState("hover")
					});
					if(c.hoverSeries !== k) k.onMouseOver();
					c.hoverPoint && c.hoverPoint.firePointEvent("mouseOut");
					if(!e.series) return;
					e.firePointEvent("mouseOver");
					c.hoverPoints = h;
					c.hoverPoint = e;
					f && f.refresh(l ? h : e, b)
				} else d && f && !f.isHidden && (e = f.getAnchor([{}], b), f.updatePosition({
					plotX: e[0],
					plotY: e[1]
				}));
				this.unDocMouseMove || (this.unDocMouseMove = C(c.container.ownerDocument, "mousemove", function(b) {
					var c = F[a.hoverChartIndex];
					if(c) c.pointer.onDocumentMouseMove(b)
				}));
				u(c.axes, function(c) {
					var d = r(c.crosshair.snap, !0),
						m = d ? a.find(h, function(a) {
							return a.series[c.coll] === c
						}) : void 0;
					m || !d ? c.drawCrosshair(b, m) : c.hideCrosshair()
				})
			},
			reset: function(a,
				c) {
				var b = this.chart,
					d = b.hoverSeries,
					f = b.hoverPoint,
					e = b.hoverPoints,
					k = b.tooltip,
					h = k && k.shared ? e : f;
				a && h && u(l(h), function(b) {
					b.series.isCartesian && void 0 === b.plotX && (a = !1)
				});
				if(a) k && h && (k.refresh(h), f && (f.setState(f.state, !0), u(b.axes, function(a) {
					a.crosshair && a.drawCrosshair(null, f)
				})));
				else {
					if(f) f.onMouseOut();
					e && u(e, function(a) {
						a.setState()
					});
					if(d) d.onMouseOut();
					k && k.hide(c);
					this.unDocMouseMove && (this.unDocMouseMove = this.unDocMouseMove());
					u(b.axes, function(a) {
						a.hideCrosshair()
					});
					this.hoverX = b.hoverPoints =
						b.hoverPoint = null
				}
			},
			scaleGroups: function(a, c) {
				var b = this.chart,
					d;
				u(b.series, function(f) {
					d = a || f.getPlotBox();
					f.xAxis && f.xAxis.zoomEnabled && f.group && (f.group.attr(d), f.markerGroup && (f.markerGroup.attr(d), f.markerGroup.clip(c ? b.clipRect : null)), f.dataLabelsGroup && f.dataLabelsGroup.attr(d))
				});
				b.clipRect.attr(c || b.clipBox)
			},
			dragStart: function(a) {
				var b = this.chart;
				b.mouseIsDown = a.type;
				b.cancelClick = !1;
				b.mouseDownX = this.mouseDownX = a.chartX;
				b.mouseDownY = this.mouseDownY = a.chartY
			},
			drag: function(a) {
				var b = this.chart,
					c = b.options.chart,
					d = a.chartX,
					f = a.chartY,
					l = this.zoomHor,
					e = this.zoomVert,
					k = b.plotLeft,
					m = b.plotTop,
					h = b.plotWidth,
					B = b.plotHeight,
					r, G = this.selectionMarker,
					g = this.mouseDownX,
					w = this.mouseDownY,
					q = c.panKey && a[c.panKey + "Key"];
				G && G.touch || (d < k ? d = k : d > k + h && (d = k + h), f < m ? f = m : f > m + B && (f = m + B), this.hasDragged = Math.sqrt(Math.pow(g - d, 2) + Math.pow(w - f, 2)), 10 < this.hasDragged && (r = b.isInsidePlot(g - k, w - m), b.hasCartesianSeries && (this.zoomX || this.zoomY) && r && !q && !G && (this.selectionMarker = G = b.renderer.rect(k, m, l ? 1 : h, e ? 1 : B, 0).attr({
					fill: c.selectionMarkerFill ||
						n("#335cad").setOpacity(.25).get(),
					"class": "highcharts-selection-marker",
					zIndex: 7
				}).add()), G && l && (d -= g, G.attr({
					width: Math.abs(d),
					x: (0 < d ? 0 : d) + g
				})), G && e && (d = f - w, G.attr({
					height: Math.abs(d),
					y: (0 < d ? 0 : d) + w
				})), r && !G && c.panning && b.pan(a, c.panning)))
			},
			drop: function(a) {
				var b = this,
					c = this.chart,
					d = this.hasPinched;
				if(this.selectionMarker) {
					var l = {
							originalEvent: a,
							xAxis: [],
							yAxis: []
						},
						k = this.selectionMarker,
						r = k.attr ? k.attr("x") : k.x,
						q = k.attr ? k.attr("y") : k.y,
						m = k.attr ? k.attr("width") : k.width,
						D = k.attr ? k.attr("height") :
						k.height,
						B;
					if(this.hasDragged || d) u(c.axes, function(c) {
						if(c.zoomEnabled && e(c.min) && (d || b[{
								xAxis: "zoomX",
								yAxis: "zoomY"
							}[c.coll]])) {
							var f = c.horiz,
								g = "touchend" === a.type ? c.minPixelPadding : 0,
								k = c.toValue((f ? r : q) + g),
								f = c.toValue((f ? r + m : q + D) - g);
							l[c.coll].push({
								axis: c,
								min: Math.min(k, f),
								max: Math.max(k, f)
							});
							B = !0
						}
					}), B && x(c, "selection", l, function(a) {
						c.zoom(y(a, d ? {
							animation: !1
						} : null))
					});
					f(c.index) && (this.selectionMarker = this.selectionMarker.destroy());
					d && this.scaleGroups()
				}
				c && f(c.index) && (h(c.container, {
						cursor: c._cursor
					}),
					c.cancelClick = 10 < this.hasDragged, c.mouseIsDown = this.hasDragged = this.hasPinched = !1, this.pinchDown = [])
			},
			onContainerMouseDown: function(a) {
				a = this.normalize(a);
				2 !== a.button && (this.zoomOption(a), a.preventDefault && a.preventDefault(), this.dragStart(a))
			},
			onDocumentMouseUp: function(b) {
				F[a.hoverChartIndex] && F[a.hoverChartIndex].pointer.drop(b)
			},
			onDocumentMouseMove: function(a) {
				var b = this.chart,
					c = this.chartPosition;
				a = this.normalize(a, c);
				!c || this.inClass(a.target, "highcharts-tracker") || b.isInsidePlot(a.chartX -
					b.plotLeft, a.chartY - b.plotTop) || this.reset()
			},
			onContainerMouseLeave: function(b) {
				var c = F[a.hoverChartIndex];
				c && (b.relatedTarget || b.toElement) && (c.pointer.reset(), c.pointer.chartPosition = null)
			},
			onContainerMouseMove: function(b) {
				var c = this.chart;
				e(a.hoverChartIndex) && F[a.hoverChartIndex] && F[a.hoverChartIndex].mouseIsDown || (a.hoverChartIndex = c.index);
				b = this.normalize(b);
				b.returnValue = !1;
				"mousedown" === c.mouseIsDown && this.drag(b);
				!this.inClass(b.target, "highcharts-tracker") && !c.isInsidePlot(b.chartX - c.plotLeft,
					b.chartY - c.plotTop) || c.openMenu || this.runPointActions(b)
			},
			inClass: function(a, c) {
				for(var b; a;) {
					if(b = E(a, "class")) {
						if(-1 !== b.indexOf(c)) return !0;
						if(-1 !== b.indexOf("highcharts-container")) return !1
					}
					a = a.parentNode
				}
			},
			onTrackerMouseOut: function(a) {
				var b = this.chart.hoverSeries;
				a = a.relatedTarget || a.toElement;
				this.isDirectTouch = !1;
				if(!(!b || !a || b.stickyTracking || this.inClass(a, "highcharts-tooltip") || this.inClass(a, "highcharts-series-" + b.index) && this.inClass(a, "highcharts-tracker"))) b.onMouseOut()
			},
			onContainerClick: function(a) {
				var b =
					this.chart,
					c = b.hoverPoint,
					d = b.plotLeft,
					f = b.plotTop;
				a = this.normalize(a);
				b.cancelClick || (c && this.inClass(a.target, "highcharts-tracker") ? (x(c.series, "click", y(a, {
					point: c
				})), b.hoverPoint && c.firePointEvent("click", a)) : (y(a, this.getCoordinates(a)), b.isInsidePlot(a.chartX - d, a.chartY - f) && x(b, "click", a)))
			},
			setDOMEvents: function() {
				var b = this,
					c = b.chart.container,
					d = c.ownerDocument;
				c.onmousedown = function(a) {
					b.onContainerMouseDown(a)
				};
				c.onmousemove = function(a) {
					b.onContainerMouseMove(a)
				};
				c.onclick = function(a) {
					b.onContainerClick(a)
				};
				this.unbindContainerMouseLeave = C(c, "mouseleave", b.onContainerMouseLeave);
				a.unbindDocumentMouseUp || (a.unbindDocumentMouseUp = C(d, "mouseup", b.onDocumentMouseUp));
				a.hasTouch && (c.ontouchstart = function(a) {
					b.onContainerTouchStart(a)
				}, c.ontouchmove = function(a) {
					b.onContainerTouchMove(a)
				}, a.unbindDocumentTouchEnd || (a.unbindDocumentTouchEnd = C(d, "touchend", b.onDocumentTouchEnd)))
			},
			destroy: function() {
				var b = this;
				b.unDocMouseMove && b.unDocMouseMove();
				this.unbindContainerMouseLeave();
				a.chartCount || (a.unbindDocumentMouseUp &&
					(a.unbindDocumentMouseUp = a.unbindDocumentMouseUp()), a.unbindDocumentTouchEnd && (a.unbindDocumentTouchEnd = a.unbindDocumentTouchEnd()));
				clearInterval(b.tooltipTimeout);
				a.objectEach(b, function(a, c) {
					b[c] = null
				})
			}
		}
	})(K);
	(function(a) {
		var C = a.charts,
			E = a.each,
			F = a.extend,
			n = a.map,
			h = a.noop,
			e = a.pick;
		F(a.Pointer.prototype, {
			pinchTranslate: function(a, e, h, n, f, c) {
				this.zoomHor && this.pinchTranslateDirection(!0, a, e, h, n, f, c);
				this.zoomVert && this.pinchTranslateDirection(!1, a, e, h, n, f, c)
			},
			pinchTranslateDirection: function(a,
				e, h, n, f, c, k, r) {
				var l = this.chart,
					d = a ? "x" : "y",
					b = a ? "X" : "Y",
					v = "chart" + b,
					p = a ? "width" : "height",
					q = l["plot" + (a ? "Left" : "Top")],
					t, u, A = r || 1,
					y = l.inverted,
					m = l.bounds[a ? "h" : "v"],
					D = 1 === e.length,
					B = e[0][v],
					M = h[0][v],
					G = !D && e[1][v],
					g = !D && h[1][v],
					w;
				h = function() {
					!D && 20 < Math.abs(B - G) && (A = r || Math.abs(M - g) / Math.abs(B - G));
					u = (q - M) / A + B;
					t = l["plot" + (a ? "Width" : "Height")] / A
				};
				h();
				e = u;
				e < m.min ? (e = m.min, w = !0) : e + t > m.max && (e = m.max - t, w = !0);
				w ? (M -= .8 * (M - k[d][0]), D || (g -= .8 * (g - k[d][1])), h()) : k[d] = [M, g];
				y || (c[d] = u - q, c[p] = t);
				c = y ? 1 / A : A;
				f[p] =
					t;
				f[d] = e;
				n[y ? a ? "scaleY" : "scaleX" : "scale" + b] = A;
				n["translate" + b] = c * q + (M - c * B)
			},
			pinch: function(a) {
				var u = this,
					q = u.chart,
					x = u.pinchDown,
					f = a.touches,
					c = f.length,
					k = u.lastValidTouch,
					r = u.hasZoom,
					l = u.selectionMarker,
					d = {},
					b = 1 === c && (u.inClass(a.target, "highcharts-tracker") && q.runTrackerClick || u.runChartClick),
					v = {};
				1 < c && (u.initiated = !0);
				r && u.initiated && !b && a.preventDefault();
				n(f, function(a) {
					return u.normalize(a)
				});
				"touchstart" === a.type ? (E(f, function(a, b) {
					x[b] = {
						chartX: a.chartX,
						chartY: a.chartY
					}
				}), k.x = [x[0].chartX,
					x[1] && x[1].chartX
				], k.y = [x[0].chartY, x[1] && x[1].chartY], E(q.axes, function(a) {
					if(a.zoomEnabled) {
						var b = q.bounds[a.horiz ? "h" : "v"],
							c = a.minPixelPadding,
							d = a.toPixels(e(a.options.min, a.dataMin)),
							f = a.toPixels(e(a.options.max, a.dataMax)),
							l = Math.max(d, f);
						b.min = Math.min(a.pos, Math.min(d, f) - c);
						b.max = Math.max(a.pos + a.len, l + c)
					}
				}), u.res = !0) : u.followTouchMove && 1 === c ? this.runPointActions(u.normalize(a)) : x.length && (l || (u.selectionMarker = l = F({
						destroy: h,
						touch: !0
					}, q.plotBox)), u.pinchTranslate(x, f, d, l, v, k), u.hasPinched =
					r, u.scaleGroups(d, v), u.res && (u.res = !1, this.reset(!1, 0)))
			},
			touch: function(h, n) {
				var q = this.chart,
					u, f;
				if(q.index !== a.hoverChartIndex) this.onContainerMouseLeave({
					relatedTarget: !0
				});
				a.hoverChartIndex = q.index;
				1 === h.touches.length ? (h = this.normalize(h), (f = q.isInsidePlot(h.chartX - q.plotLeft, h.chartY - q.plotTop)) && !q.openMenu ? (n && this.runPointActions(h), "touchmove" === h.type && (n = this.pinchDown, u = n[0] ? 4 <= Math.sqrt(Math.pow(n[0].chartX - h.chartX, 2) + Math.pow(n[0].chartY - h.chartY, 2)) : !1), e(u, !0) && this.pinch(h)) : n &&
					this.reset()) : 2 === h.touches.length && this.pinch(h)
			},
			onContainerTouchStart: function(a) {
				this.zoomOption(a);
				this.touch(a, !0)
			},
			onContainerTouchMove: function(a) {
				this.touch(a)
			},
			onDocumentTouchEnd: function(e) {
				C[a.hoverChartIndex] && C[a.hoverChartIndex].pointer.drop(e)
			}
		})
	})(K);
	(function(a) {
		var C = a.addEvent,
			E = a.charts,
			F = a.css,
			n = a.doc,
			h = a.extend,
			e = a.noop,
			u = a.Pointer,
			y = a.removeEvent,
			q = a.win,
			x = a.wrap;
		if(!a.hasTouch && (q.PointerEvent || q.MSPointerEvent)) {
			var f = {},
				c = !!q.PointerEvent,
				k = function() {
					var c = [];
					c.item = function(a) {
						return this[a]
					};
					a.objectEach(f, function(a) {
						c.push({
							pageX: a.pageX,
							pageY: a.pageY,
							target: a.target
						})
					});
					return c
				},
				r = function(c, d, b, f) {
					"touch" !== c.pointerType && c.pointerType !== c.MSPOINTER_TYPE_TOUCH || !E[a.hoverChartIndex] || (f(c), f = E[a.hoverChartIndex].pointer, f[d]({
						type: b,
						target: c.currentTarget,
						preventDefault: e,
						touches: k()
					}))
				};
			h(u.prototype, {
				onContainerPointerDown: function(a) {
					r(a, "onContainerTouchStart", "touchstart", function(a) {
						f[a.pointerId] = {
							pageX: a.pageX,
							pageY: a.pageY,
							target: a.currentTarget
						}
					})
				},
				onContainerPointerMove: function(a) {
					r(a,
						"onContainerTouchMove", "touchmove",
						function(a) {
							f[a.pointerId] = {
								pageX: a.pageX,
								pageY: a.pageY
							};
							f[a.pointerId].target || (f[a.pointerId].target = a.currentTarget)
						})
				},
				onDocumentPointerUp: function(a) {
					r(a, "onDocumentTouchEnd", "touchend", function(a) {
						delete f[a.pointerId]
					})
				},
				batchMSEvents: function(a) {
					a(this.chart.container, c ? "pointerdown" : "MSPointerDown", this.onContainerPointerDown);
					a(this.chart.container, c ? "pointermove" : "MSPointerMove", this.onContainerPointerMove);
					a(n, c ? "pointerup" : "MSPointerUp", this.onDocumentPointerUp)
				}
			});
			x(u.prototype, "init", function(a, c, b) {
				a.call(this, c, b);
				this.hasZoom && F(c.container, {
					"-ms-touch-action": "none",
					"touch-action": "none"
				})
			});
			x(u.prototype, "setDOMEvents", function(a) {
				a.apply(this);
				(this.hasZoom || this.followTouchMove) && this.batchMSEvents(C)
			});
			x(u.prototype, "destroy", function(a) {
				this.batchMSEvents(y);
				a.call(this)
			})
		}
	})(K);
	(function(a) {
		var C = a.addEvent,
			E = a.css,
			F = a.discardElement,
			n = a.defined,
			h = a.each,
			e = a.fireEvent,
			u = a.isFirefox,
			y = a.marginNames,
			q = a.merge,
			x = a.pick,
			f = a.setAnimation,
			c = a.stableSort,
			k = a.win,
			r = a.wrap;
		a.Legend = function(a, c) {
			this.init(a, c)
		};
		a.Legend.prototype = {
			init: function(a, c) {
				this.chart = a;
				this.setOptions(c);
				c.enabled && (this.render(), C(this.chart, "endResize", function() {
					this.legend.positionCheckboxes()
				}), this.proximate ? this.unchartrender = C(this.chart, "render", function() {
					this.legend.proximatePositions();
					this.legend.positionItems()
				}) : this.unchartrender && this.unchartrender())
			},
			setOptions: function(a) {
				var c = x(a.padding, 8);
				this.options = a;
				this.itemStyle = a.itemStyle;
				this.itemHiddenStyle =
					q(this.itemStyle, a.itemHiddenStyle);
				this.itemMarginTop = a.itemMarginTop || 0;
				this.padding = c;
				this.initialItemY = c - 5;
				this.symbolWidth = x(a.symbolWidth, 16);
				this.pages = [];
				this.proximate = "proximate" === a.layout && !this.chart.inverted
			},
			update: function(a, c) {
				var b = this.chart;
				this.setOptions(q(!0, this.options, a));
				this.destroy();
				b.isDirtyLegend = b.isDirtyBox = !0;
				x(c, !0) && b.redraw();
				e(this, "afterUpdate")
			},
			colorizeItem: function(a, c) {
				a.legendGroup[c ? "removeClass" : "addClass"]("highcharts-legend-item-hidden");
				var b = this.options,
					d = a.legendItem,
					f = a.legendLine,
					l = a.legendSymbol,
					k = this.itemHiddenStyle.color,
					b = c ? b.itemStyle.color : k,
					h = c ? a.color || k : k,
					r = a.options && a.options.marker,
					q = {
						fill: h
					};
				d && d.css({
					fill: b,
					color: b
				});
				f && f.attr({
					stroke: h
				});
				l && (r && l.isMarker && (q = a.pointAttribs(), c || (q.stroke = q.fill = k)), l.attr(q));
				e(this, "afterColorizeItem", {
					item: a,
					visible: c
				})
			},
			positionItems: function() {
				h(this.allItems, this.positionItem, this);
				this.chart.isResizing || this.positionCheckboxes()
			},
			positionItem: function(a) {
				var c = this.options,
					b = c.symbolPadding,
					c = !c.rtl,
					f = a._legendItemPos,
					l = f[0],
					f = f[1],
					e = a.checkbox;
				if((a = a.legendGroup) && a.element) a[n(a.translateY) ? "animate" : "attr"]({
					translateX: c ? l : this.legendWidth - l - 2 * b - 4,
					translateY: f
				});
				e && (e.x = l, e.y = f)
			},
			destroyItem: function(a) {
				var c = a.checkbox;
				h(["legendItem", "legendLine", "legendSymbol", "legendGroup"], function(b) {
					a[b] && (a[b] = a[b].destroy())
				});
				c && F(a.checkbox)
			},
			destroy: function() {
				function a(a) {
					this[a] && (this[a] = this[a].destroy())
				}
				h(this.getAllItems(), function(c) {
					h(["legendItem", "legendGroup"], a, c)
				});
				h("clipRect up down pager nav box title group".split(" "),
					a, this);
				this.display = null
			},
			positionCheckboxes: function() {
				var a = this.group && this.group.alignAttr,
					c, b = this.clipHeight || this.legendHeight,
					f = this.titleHeight;
				a && (c = a.translateY, h(this.allItems, function(d) {
					var l = d.checkbox,
						e;
					l && (e = c + f + l.y + (this.scrollOffset || 0) + 3, E(l, {
						left: a.translateX + d.checkboxOffset + l.x - 20 + "px",
						top: e + "px",
						display: e > c - 6 && e < c + b - 6 ? "" : "none"
					}))
				}, this))
			},
			renderTitle: function() {
				var a = this.options,
					c = this.padding,
					b = a.title,
					f = 0;
				b.text && (this.title || (this.title = this.chart.renderer.label(b.text,
					c - 3, c - 4, null, null, null, a.useHTML, null, "legend-title").attr({
					zIndex: 1
				}).css(b.style).add(this.group)), a = this.title.getBBox(), f = a.height, this.offsetWidth = a.width, this.contentGroup.attr({
					translateY: f
				}));
				this.titleHeight = f
			},
			setText: function(c) {
				var d = this.options;
				c.legendItem.attr({
					text: d.labelFormat ? a.format(d.labelFormat, c, this.chart.time) : d.labelFormatter.call(c)
				})
			},
			renderItem: function(a) {
				var c = this.chart,
					b = c.renderer,
					f = this.options,
					e = this.symbolWidth,
					l = f.symbolPadding,
					k = this.itemStyle,
					h = this.itemHiddenStyle,
					r = "horizontal" === f.layout ? x(f.itemDistance, 20) : 0,
					n = !f.rtl,
					m = a.legendItem,
					D = !a.series,
					B = !D && a.series.drawLegendSymbol ? a.series : a,
					u = B.options,
					u = this.createCheckboxForItem && u && u.showCheckbox,
					r = e + l + r + (u ? 20 : 0),
					G = f.useHTML,
					g = a.options.className;
				m || (a.legendGroup = b.g("legend-item").addClass("highcharts-" + B.type + "-series highcharts-color-" + a.colorIndex + (g ? " " + g : "") + (D ? " highcharts-series-" + a.index : "")).attr({
					zIndex: 1
				}).add(this.scrollGroup), a.legendItem = m = b.text("", n ? e + l : -l, this.baseline || 0, G).css(q(a.visible ?
					k : h)).attr({
					align: n ? "left" : "right",
					zIndex: 2
				}).add(a.legendGroup), this.baseline || (e = k.fontSize, this.fontMetrics = b.fontMetrics(e, m), this.baseline = this.fontMetrics.f + 3 + this.itemMarginTop, m.attr("y", this.baseline)), this.symbolHeight = f.symbolHeight || this.fontMetrics.f, B.drawLegendSymbol(this, a), this.setItemEvents && this.setItemEvents(a, m, G), u && this.createCheckboxForItem(a));
				this.colorizeItem(a, a.visible);
				k.width || m.css({
					width: (f.itemWidth || f.width || c.spacingBox.width) - r
				});
				this.setText(a);
				c = m.getBBox();
				a.itemWidth = a.checkboxOffset = f.itemWidth || a.legendItemWidth || c.width + r;
				this.maxItemWidth = Math.max(this.maxItemWidth, a.itemWidth);
				this.totalItemWidth += a.itemWidth;
				this.itemHeight = a.itemHeight = Math.round(a.legendItemHeight || c.height || this.symbolHeight)
			},
			layoutItem: function(a) {
				var c = this.options,
					b = this.padding,
					f = "horizontal" === c.layout,
					e = a.itemHeight,
					l = c.itemMarginBottom || 0,
					k = this.itemMarginTop,
					h = f ? x(c.itemDistance, 20) : 0,
					r = c.width,
					q = r || this.chart.spacingBox.width - 2 * b - c.x,
					c = c.alignColumns && this.totalItemWidth >
					q ? this.maxItemWidth : a.itemWidth;
				f && this.itemX - b + c > q && (this.itemX = b, this.itemY += k + this.lastLineHeight + l, this.lastLineHeight = 0);
				this.lastItemY = k + this.itemY + l;
				this.lastLineHeight = Math.max(e, this.lastLineHeight);
				a._legendItemPos = [this.itemX, this.itemY];
				f ? this.itemX += c : (this.itemY += k + e + l, this.lastLineHeight = e);
				this.offsetWidth = r || Math.max((f ? this.itemX - b - (a.checkbox ? 0 : h) : c) + b, this.offsetWidth)
			},
			getAllItems: function() {
				var a = [];
				h(this.chart.series, function(c) {
					var b = c && c.options;
					c && x(b.showInLegend, n(b.linkedTo) ?
						!1 : void 0, !0) && (a = a.concat(c.legendItems || ("point" === b.legendType ? c.data : c)))
				});
				e(this, "afterGetAllItems", {
					allItems: a
				});
				return a
			},
			getAlignment: function() {
				var a = this.options;
				return this.proximate ? a.align.charAt(0) + "tv" : a.floating ? "" : a.align.charAt(0) + a.verticalAlign.charAt(0) + a.layout.charAt(0)
			},
			adjustMargins: function(a, c) {
				var b = this.chart,
					d = this.options,
					f = this.getAlignment();
				f && h([/(lth|ct|rth)/, /(rtv|rm|rbv)/, /(rbh|cb|lbh)/, /(lbv|lm|ltv)/], function(e, l) {
					e.test(f) && !n(a[l]) && (b[y[l]] = Math.max(b[y[l]],
						b.legend[(l + 1) % 2 ? "legendHeight" : "legendWidth"] + [1, -1, -1, 1][l] * d[l % 2 ? "x" : "y"] + x(d.margin, 12) + c[l] + (0 === l && void 0 !== b.options.title.margin ? b.titleOffset + b.options.title.margin : 0)))
				})
			},
			proximatePositions: function() {
				var c = this.chart,
					d = [],
					b = "left" === this.options.align;
				h(this.allItems, function(f) {
					var e, l;
					e = b;
					f.xAxis && f.points && (f.xAxis.options.reversed && (e = !e), e = a.find(e ? f.points : f.points.slice(0).reverse(), function(b) {
						return a.isNumber(b.plotY)
					}), l = f.legendGroup.getBBox().height, d.push({
						target: f.visible ?
							e.plotY - .3 * l : c.plotHeight,
						size: l,
						item: f
					}))
				}, this);
				a.distribute(d, c.plotHeight);
				h(d, function(a) {
					a.item._legendItemPos[1] = c.plotTop - c.spacing[0] + a.pos
				})
			},
			render: function() {
				var a = this.chart,
					d = a.renderer,
					b = this.group,
					f, e, k, r = this.box,
					n = this.options,
					A = this.padding;
				this.itemX = A;
				this.itemY = this.initialItemY;
				this.lastItemY = this.offsetWidth = 0;
				b || (this.group = b = d.g("legend").attr({
					zIndex: 7
				}).add(), this.contentGroup = d.g().attr({
					zIndex: 1
				}).add(b), this.scrollGroup = d.g().add(this.contentGroup));
				this.renderTitle();
				f = this.getAllItems();
				c(f, function(a, b) {
					return(a.options && a.options.legendIndex || 0) - (b.options && b.options.legendIndex || 0)
				});
				n.reversed && f.reverse();
				this.allItems = f;
				this.display = e = !!f.length;
				this.itemHeight = this.totalItemWidth = this.maxItemWidth = this.lastLineHeight = 0;
				h(f, this.renderItem, this);
				h(f, this.layoutItem, this);
				f = (n.width || this.offsetWidth) + A;
				k = this.lastItemY + this.lastLineHeight + this.titleHeight;
				k = this.handleOverflow(k);
				k += A;
				r || (this.box = r = d.rect().addClass("highcharts-legend-box").attr({
						r: n.borderRadius
					}).add(b),
					r.isNew = !0);
				r.attr({
					stroke: n.borderColor,
					"stroke-width": n.borderWidth || 0,
					fill: n.backgroundColor || "none"
				}).shadow(n.shadow);
				0 < f && 0 < k && (r[r.isNew ? "attr" : "animate"](r.crisp.call({}, {
					x: 0,
					y: 0,
					width: f,
					height: k
				}, r.strokeWidth())), r.isNew = !1);
				r[e ? "show" : "hide"]();
				this.legendWidth = f;
				this.legendHeight = k;
				e && (d = a.spacingBox, /(lth|ct|rth)/.test(this.getAlignment()) && (d = q(d, {
					y: d.y + a.titleOffset + a.options.title.margin
				})), b.align(q(n, {
					width: f,
					height: k,
					verticalAlign: this.proximate ? "top" : n.verticalAlign
				}), !0, d));
				this.proximate ||
					this.positionItems()
			},
			handleOverflow: function(a) {
				var c = this,
					b = this.chart,
					f = b.renderer,
					e = this.options,
					l = e.y,
					k = this.padding,
					b = b.spacingBox.height + ("top" === e.verticalAlign ? -l : l) - k,
					l = e.maxHeight,
					r, A = this.clipRect,
					q = e.navigation,
					m = x(q.animation, !0),
					D = q.arrowSize || 12,
					B = this.nav,
					n = this.pages,
					G, g = this.allItems,
					w = function(a) {
						"number" === typeof a ? A.attr({
							height: a
						}) : A && (c.clipRect = A.destroy(), c.contentGroup.clip());
						c.contentGroup.div && (c.contentGroup.div.style.clip = a ? "rect(" + k + "px,9999px," + (k + a) + "px,0)" : "auto")
					};
				"horizontal" !== e.layout || "middle" === e.verticalAlign || e.floating || (b /= 2);
				l && (b = Math.min(b, l));
				n.length = 0;
				a > b && !1 !== q.enabled ? (this.clipHeight = r = Math.max(b - 20 - this.titleHeight - k, 0), this.currentPage = x(this.currentPage, 1), this.fullHeight = a, h(g, function(a, b) {
					var c = a._legendItemPos[1],
						d = Math.round(a.legendItem.getBBox().height),
						f = n.length;
					if(!f || c - n[f - 1] > r && (G || c) !== n[f - 1]) n.push(G || c), f++;
					a.pageIx = f - 1;
					G && (g[b - 1].pageIx = f - 1);
					b === g.length - 1 && c + d - n[f - 1] > r && (n.push(c), a.pageIx = f);
					c !== G && (G = c)
				}), A || (A = c.clipRect =
					f.clipRect(0, k, 9999, 0), c.contentGroup.clip(A)), w(r), B || (this.nav = B = f.g().attr({
					zIndex: 1
				}).add(this.group), this.up = f.symbol("triangle", 0, 0, D, D).on("click", function() {
					c.scroll(-1, m)
				}).add(B), this.pager = f.text("", 15, 10).addClass("highcharts-legend-navigation").css(q.style).add(B), this.down = f.symbol("triangle-down", 0, 0, D, D).on("click", function() {
					c.scroll(1, m)
				}).add(B)), c.scroll(0), a = b) : B && (w(), this.nav = B.destroy(), this.scrollGroup.attr({
					translateY: 1
				}), this.clipHeight = 0);
				return a
			},
			scroll: function(a, c) {
				var b =
					this.pages,
					d = b.length;
				a = this.currentPage + a;
				var e = this.clipHeight,
					l = this.options.navigation,
					k = this.pager,
					h = this.padding;
				a > d && (a = d);
				0 < a && (void 0 !== c && f(c, this.chart), this.nav.attr({
						translateX: h,
						translateY: e + this.padding + 7 + this.titleHeight,
						visibility: "visible"
					}), this.up.attr({
						"class": 1 === a ? "highcharts-legend-nav-inactive" : "highcharts-legend-nav-active"
					}), k.attr({
						text: a + "/" + d
					}), this.down.attr({
						x: 18 + this.pager.getBBox().width,
						"class": a === d ? "highcharts-legend-nav-inactive" : "highcharts-legend-nav-active"
					}),
					this.up.attr({
						fill: 1 === a ? l.inactiveColor : l.activeColor
					}).css({
						cursor: 1 === a ? "default" : "pointer"
					}), this.down.attr({
						fill: a === d ? l.inactiveColor : l.activeColor
					}).css({
						cursor: a === d ? "default" : "pointer"
					}), this.scrollOffset = -b[a - 1] + this.initialItemY, this.scrollGroup.animate({
						translateY: this.scrollOffset
					}), this.currentPage = a, this.positionCheckboxes())
			}
		};
		a.LegendSymbolMixin = {
			drawRectangle: function(a, c) {
				var b = a.symbolHeight,
					d = a.options.squareSymbol;
				c.legendSymbol = this.chart.renderer.rect(d ? (a.symbolWidth - b) / 2 :
					0, a.baseline - b + 1, d ? b : a.symbolWidth, b, x(a.options.symbolRadius, b / 2)).addClass("highcharts-point").attr({
					zIndex: 3
				}).add(c.legendGroup)
			},
			drawLineMarker: function(a) {
				var c = this.options,
					b = c.marker,
					f = a.symbolWidth,
					e = a.symbolHeight,
					k = e / 2,
					l = this.chart.renderer,
					h = this.legendGroup;
				a = a.baseline - Math.round(.3 * a.fontMetrics.b);
				var r;
				r = {
					"stroke-width": c.lineWidth || 0
				};
				c.dashStyle && (r.dashstyle = c.dashStyle);
				this.legendLine = l.path(["M", 0, a, "L", f, a]).addClass("highcharts-graph").attr(r).add(h);
				b && !1 !== b.enabled && f &&
					(c = Math.min(x(b.radius, k), k), 0 === this.symbol.indexOf("url") && (b = q(b, {
						width: e,
						height: e
					}), c = 0), this.legendSymbol = b = l.symbol(this.symbol, f / 2 - c, a - c, 2 * c, 2 * c, b).addClass("highcharts-point").add(h), b.isMarker = !0)
			}
		};
		(/Trident\/7\.0/.test(k.navigator.userAgent) || u) && r(a.Legend.prototype, "positionItem", function(a, c) {
			var b = this,
				d = function() {
					c._legendItemPos && a.call(b, c)
				};
			d();
			setTimeout(d)
		})
	})(K);
	(function(a) {
		var C = a.addEvent,
			E = a.animate,
			F = a.animObject,
			n = a.attr,
			h = a.doc,
			e = a.Axis,
			u = a.createElement,
			y = a.defaultOptions,
			q = a.discardElement,
			x = a.charts,
			f = a.css,
			c = a.defined,
			k = a.each,
			r = a.extend,
			l = a.find,
			d = a.fireEvent,
			b = a.grep,
			v = a.isNumber,
			p = a.isObject,
			I = a.isString,
			t = a.Legend,
			L = a.marginNames,
			A = a.merge,
			H = a.objectEach,
			m = a.Pointer,
			D = a.pick,
			B = a.pInt,
			M = a.removeEvent,
			G = a.seriesTypes,
			g = a.splat,
			w = a.syncTimeout,
			P = a.win,
			Q = a.Chart = function() {
				this.getArgs.apply(this, arguments)
			};
		a.chart = function(a, b, c) {
			return new Q(a, b, c)
		};
		r(Q.prototype, {
			callbacks: [],
			getArgs: function() {
				var a = [].slice.call(arguments);
				if(I(a[0]) || a[0].nodeName) this.renderTo =
					a.shift();
				this.init(a[0], a[1])
			},
			init: function(b, c) {
				var g, f, m = b.series,
					e = b.plotOptions || {};
				d(this, "init", {
					args: arguments
				}, function() {
					b.series = null;
					g = A(y, b);
					for(f in g.plotOptions) g.plotOptions[f].tooltip = e[f] && A(e[f].tooltip) || void 0;
					g.tooltip.userOptions = b.chart && b.chart.forExport && b.tooltip.userOptions || b.tooltip;
					g.series = b.series = m;
					this.userOptions = b;
					var k = g.chart,
						l = k.events;
					this.margin = [];
					this.spacing = [];
					this.bounds = {
						h: {},
						v: {}
					};
					this.labelCollectors = [];
					this.callback = c;
					this.isResizing = 0;
					this.options =
						g;
					this.axes = [];
					this.series = [];
					this.time = b.time && a.keys(b.time).length ? new a.Time(b.time) : a.time;
					this.hasCartesianSeries = k.showAxes;
					var h = this;
					h.index = x.length;
					x.push(h);
					a.chartCount++;
					l && H(l, function(a, b) {
						C(h, b, a)
					});
					h.xAxis = [];
					h.yAxis = [];
					h.pointCount = h.colorCounter = h.symbolCounter = 0;
					d(h, "afterInit");
					h.firstRender()
				})
			},
			initSeries: function(b) {
				var c = this.options.chart;
				(c = G[b.type || c.type || c.defaultSeriesType]) || a.error(17, !0);
				c = new c;
				c.init(this, b);
				return c
			},
			orderSeries: function(a) {
				var b = this.series;
				for(a = a || 0; a < b.length; a++) b[a] && (b[a].index = a, b[a].name = b[a].getName())
			},
			isInsidePlot: function(a, b, c) {
				var d = c ? b : a;
				a = c ? a : b;
				return 0 <= d && d <= this.plotWidth && 0 <= a && a <= this.plotHeight
			},
			redraw: function(b) {
				d(this, "beforeRedraw");
				var c = this.axes,
					g = this.series,
					f = this.pointer,
					m = this.legend,
					e = this.isDirtyLegend,
					l, h, B = this.hasCartesianSeries,
					D = this.isDirtyBox,
					w, p = this.renderer,
					t = p.isHidden(),
					G = [];
				this.setResponsive && this.setResponsive(!1);
				a.setAnimation(b, this);
				t && this.temporaryDisplay();
				this.layOutTitles();
				for(b = g.length; b--;)
					if(w = g[b], w.options.stacking && (l = !0, w.isDirty)) {
						h = !0;
						break
					}
				if(h)
					for(b = g.length; b--;) w = g[b], w.options.stacking && (w.isDirty = !0);
				k(g, function(a) {
					a.isDirty && "point" === a.options.legendType && (a.updateTotals && a.updateTotals(), e = !0);
					a.isDirtyData && d(a, "updatedData")
				});
				e && m.options.enabled && (m.render(), this.isDirtyLegend = !1);
				l && this.getStacks();
				B && k(c, function(a) {
					a.updateNames();
					a.setScale()
				});
				this.getMargins();
				B && (k(c, function(a) {
					a.isDirty && (D = !0)
				}), k(c, function(a) {
					var b = a.min + "," + a.max;
					a.extKey !== b && (a.extKey = b, G.push(function() {
						d(a, "afterSetExtremes", r(a.eventArgs, a.getExtremes()));
						delete a.eventArgs
					}));
					(D || l) && a.redraw()
				}));
				D && this.drawChartBox();
				d(this, "predraw");
				k(g, function(a) {
					(D || a.isDirty) && a.visible && a.redraw();
					a.isDirtyData = !1
				});
				f && f.reset(!0);
				p.draw();
				d(this, "redraw");
				d(this, "render");
				t && this.temporaryDisplay(!0);
				k(G, function(a) {
					a.call()
				})
			},
			get: function(a) {
				function b(b) {
					return b.id === a || b.options && b.options.id === a
				}
				var c, d = this.series,
					g;
				c = l(this.axes, b) || l(this.series,
					b);
				for(g = 0; !c && g < d.length; g++) c = l(d[g].points || [], b);
				return c
			},
			getAxes: function() {
				var a = this,
					b = this.options,
					c = b.xAxis = g(b.xAxis || {}),
					b = b.yAxis = g(b.yAxis || {});
				d(this, "getAxes");
				k(c, function(a, b) {
					a.index = b;
					a.isX = !0
				});
				k(b, function(a, b) {
					a.index = b
				});
				c = c.concat(b);
				k(c, function(b) {
					new e(a, b)
				});
				d(this, "afterGetAxes")
			},
			getSelectedPoints: function() {
				var a = [];
				k(this.series, function(c) {
					a = a.concat(b(c.data || [], function(a) {
						return a.selected
					}))
				});
				return a
			},
			getSelectedSeries: function() {
				return b(this.series, function(a) {
					return a.selected
				})
			},
			setTitle: function(a, b, c) {
				var d = this,
					g = d.options,
					f;
				f = g.title = A({
					style: {
						color: "#333333",
						fontSize: g.isStock ? "16px" : "18px"
					}
				}, g.title, a);
				g = g.subtitle = A({
					style: {
						color: "#666666"
					}
				}, g.subtitle, b);
				k([
					["title", a, f],
					["subtitle", b, g]
				], function(a, b) {
					var c = a[0],
						g = d[c],
						f = a[1];
					a = a[2];
					g && f && (d[c] = g = g.destroy());
					a && !g && (d[c] = d.renderer.text(a.text, 0, 0, a.useHTML).attr({
						align: a.align,
						"class": "highcharts-" + c,
						zIndex: a.zIndex || 4
					}).add(), d[c].update = function(a) {
						d.setTitle(!b && a, b && a)
					}, d[c].css(a.style))
				});
				d.layOutTitles(c)
			},
			layOutTitles: function(a) {
				var b = 0,
					c, d = this.renderer,
					g = this.spacingBox;
				k(["title", "subtitle"], function(a) {
					var c = this[a],
						f = this.options[a];
					a = "title" === a ? -3 : f.verticalAlign ? 0 : b + 2;
					var m;
					c && (m = f.style.fontSize, m = d.fontMetrics(m, c).b, c.css({
						width: (f.width || g.width + f.widthAdjust) + "px"
					}).align(r({
						y: a + m
					}, f), !1, "spacingBox"), f.floating || f.verticalAlign || (b = Math.ceil(b + c.getBBox(f.useHTML).height)))
				}, this);
				c = this.titleOffset !== b;
				this.titleOffset = b;
				!this.isDirtyBox && c && (this.isDirtyBox = this.isDirtyLegend = c, this.hasRendered &&
					D(a, !0) && this.isDirtyBox && this.redraw())
			},
			getChartSize: function() {
				var b = this.options.chart,
					d = b.width,
					b = b.height,
					g = this.renderTo;
				c(d) || (this.containerWidth = a.getStyle(g, "width"));
				c(b) || (this.containerHeight = a.getStyle(g, "height"));
				this.chartWidth = Math.max(0, d || this.containerWidth || 600);
				this.chartHeight = Math.max(0, a.relativeLength(b, this.chartWidth) || (1 < this.containerHeight ? this.containerHeight : 400))
			},
			temporaryDisplay: function(b) {
				var c = this.renderTo;
				if(b)
					for(; c && c.style;) c.hcOrigStyle && (a.css(c, c.hcOrigStyle),
						delete c.hcOrigStyle), c.hcOrigDetached && (h.body.removeChild(c), c.hcOrigDetached = !1), c = c.parentNode;
				else
					for(; c && c.style;) {
						h.body.contains(c) || c.parentNode || (c.hcOrigDetached = !0, h.body.appendChild(c));
						if("none" === a.getStyle(c, "display", !1) || c.hcOricDetached) c.hcOrigStyle = {
							display: c.style.display,
							height: c.style.height,
							overflow: c.style.overflow
						}, b = {
							display: "block",
							overflow: "hidden"
						}, c !== this.renderTo && (b.height = 0), a.css(c, b), c.offsetWidth || c.style.setProperty("display", "block", "important");
						c = c.parentNode;
						if(c === h.body) break
					}
			},
			setClassName: function(a) {
				this.container.className = "highcharts-container " + (a || "")
			},
			getContainer: function() {
				var b, c = this.options,
					g = c.chart,
					f, m;
				b = this.renderTo;
				var e = a.uniqueKey(),
					k;
				b || (this.renderTo = b = g.renderTo);
				I(b) && (this.renderTo = b = h.getElementById(b));
				b || a.error(13, !0);
				f = B(n(b, "data-highcharts-chart"));
				v(f) && x[f] && x[f].hasRendered && x[f].destroy();
				n(b, "data-highcharts-chart", this.index);
				b.innerHTML = "";
				g.skipClone || b.offsetWidth || this.temporaryDisplay();
				this.getChartSize();
				f = this.chartWidth;
				m = this.chartHeight;
				k = r({
					position: "relative",
					overflow: "hidden",
					width: f + "px",
					height: m + "px",
					textAlign: "left",
					lineHeight: "normal",
					zIndex: 0,
					"-webkit-tap-highlight-color": "rgba(0,0,0,0)"
				}, g.style);
				this.container = b = u("div", {
					id: e
				}, k, b);
				this._cursor = b.style.cursor;
				this.renderer = new(a[g.renderer] || a.Renderer)(b, f, m, null, g.forExport, c.exporting && c.exporting.allowHTML);
				this.setClassName(g.className);
				this.renderer.setStyle(g.style);
				this.renderer.chartIndex = this.index;
				d(this, "afterGetContainer")
			},
			getMargins: function(a) {
				var b = this.spacing,
					g = this.margin,
					f = this.titleOffset;
				this.resetMargins();
				f && !c(g[0]) && (this.plotTop = Math.max(this.plotTop, f + this.options.title.margin + b[0]));
				this.legend && this.legend.display && this.legend.adjustMargins(g, b);
				d(this, "getMargins");
				a || this.getAxisMargins()
			},
			getAxisMargins: function() {
				var a = this,
					b = a.axisOffset = [0, 0, 0, 0],
					d = a.margin;
				a.hasCartesianSeries && k(a.axes, function(a) {
					a.visible && a.getOffset()
				});
				k(L, function(g, f) {
					c(d[f]) || (a[g] += b[f])
				});
				a.setChartSize()
			},
			reflow: function(b) {
				var d =
					this,
					g = d.options.chart,
					f = d.renderTo,
					m = c(g.width) && c(g.height),
					e = g.width || a.getStyle(f, "width"),
					g = g.height || a.getStyle(f, "height"),
					f = b ? b.target : P;
				if(!m && !d.isPrinting && e && g && (f === P || f === h)) {
					if(e !== d.containerWidth || g !== d.containerHeight) a.clearTimeout(d.reflowTimeout), d.reflowTimeout = w(function() {
						d.container && d.setSize(void 0, void 0, !1)
					}, b ? 100 : 0);
					d.containerWidth = e;
					d.containerHeight = g
				}
			},
			setReflow: function(a) {
				var b = this;
				!1 === a || this.unbindReflow ? !1 === a && this.unbindReflow && (this.unbindReflow = this.unbindReflow()) :
					(this.unbindReflow = C(P, "resize", function(a) {
						b.reflow(a)
					}), C(this, "destroy", this.unbindReflow))
			},
			setSize: function(b, c, g) {
				var m = this,
					e = m.renderer;
				m.isResizing += 1;
				a.setAnimation(g, m);
				m.oldChartHeight = m.chartHeight;
				m.oldChartWidth = m.chartWidth;
				void 0 !== b && (m.options.chart.width = b);
				void 0 !== c && (m.options.chart.height = c);
				m.getChartSize();
				b = e.globalAnimation;
				(b ? E : f)(m.container, {
					width: m.chartWidth + "px",
					height: m.chartHeight + "px"
				}, b);
				m.setChartSize(!0);
				e.setSize(m.chartWidth, m.chartHeight, g);
				k(m.axes, function(a) {
					a.isDirty = !0;
					a.setScale()
				});
				m.isDirtyLegend = !0;
				m.isDirtyBox = !0;
				m.layOutTitles();
				m.getMargins();
				m.redraw(g);
				m.oldChartHeight = null;
				d(m, "resize");
				w(function() {
					m && d(m, "endResize", null, function() {
						--m.isResizing
					})
				}, F(b).duration)
			},
			setChartSize: function(a) {
				var b = this.inverted,
					c = this.renderer,
					g = this.chartWidth,
					f = this.chartHeight,
					m = this.options.chart,
					e = this.spacing,
					l = this.clipOffset,
					h, B, D, r;
				this.plotLeft = h = Math.round(this.plotLeft);
				this.plotTop = B = Math.round(this.plotTop);
				this.plotWidth = D = Math.max(0, Math.round(g - h - this.marginRight));
				this.plotHeight = r = Math.max(0, Math.round(f - B - this.marginBottom));
				this.plotSizeX = b ? r : D;
				this.plotSizeY = b ? D : r;
				this.plotBorderWidth = m.plotBorderWidth || 0;
				this.spacingBox = c.spacingBox = {
					x: e[3],
					y: e[0],
					width: g - e[3] - e[1],
					height: f - e[0] - e[2]
				};
				this.plotBox = c.plotBox = {
					x: h,
					y: B,
					width: D,
					height: r
				};
				g = 2 * Math.floor(this.plotBorderWidth / 2);
				b = Math.ceil(Math.max(g, l[3]) / 2);
				c = Math.ceil(Math.max(g, l[0]) / 2);
				this.clipBox = {
					x: b,
					y: c,
					width: Math.floor(this.plotSizeX - Math.max(g, l[1]) / 2 - b),
					height: Math.max(0, Math.floor(this.plotSizeY -
						Math.max(g, l[2]) / 2 - c))
				};
				a || k(this.axes, function(a) {
					a.setAxisSize();
					a.setAxisTranslation()
				});
				d(this, "afterSetChartSize", {
					skipAxes: a
				})
			},
			resetMargins: function() {
				var a = this,
					b = a.options.chart;
				k(["margin", "spacing"], function(c) {
					var d = b[c],
						g = p(d) ? d : [d, d, d, d];
					k(["Top", "Right", "Bottom", "Left"], function(d, f) {
						a[c][f] = D(b[c + d], g[f])
					})
				});
				k(L, function(b, c) {
					a[b] = D(a.margin[c], a.spacing[c])
				});
				a.axisOffset = [0, 0, 0, 0];
				a.clipOffset = [0, 0, 0, 0]
			},
			drawChartBox: function() {
				var a = this.options.chart,
					b = this.renderer,
					c = this.chartWidth,
					g = this.chartHeight,
					f = this.chartBackground,
					m = this.plotBackground,
					e = this.plotBorder,
					k, l = this.plotBGImage,
					h = a.backgroundColor,
					B = a.plotBackgroundColor,
					D = a.plotBackgroundImage,
					r, w = this.plotLeft,
					p = this.plotTop,
					t = this.plotWidth,
					G = this.plotHeight,
					A = this.plotBox,
					n = this.clipRect,
					q = this.clipBox,
					v = "animate";
				f || (this.chartBackground = f = b.rect().addClass("highcharts-background").add(), v = "attr");
				k = a.borderWidth || 0;
				r = k + (a.shadow ? 8 : 0);
				h = {
					fill: h || "none"
				};
				if(k || f["stroke-width"]) h.stroke = a.borderColor, h["stroke-width"] =
					k;
				f.attr(h).shadow(a.shadow);
				f[v]({
					x: r / 2,
					y: r / 2,
					width: c - r - k % 2,
					height: g - r - k % 2,
					r: a.borderRadius
				});
				v = "animate";
				m || (v = "attr", this.plotBackground = m = b.rect().addClass("highcharts-plot-background").add());
				m[v](A);
				m.attr({
					fill: B || "none"
				}).shadow(a.plotShadow);
				D && (l ? l.animate(A) : this.plotBGImage = b.image(D, w, p, t, G).add());
				n ? n.animate({
					width: q.width,
					height: q.height
				}) : this.clipRect = b.clipRect(q);
				v = "animate";
				e || (v = "attr", this.plotBorder = e = b.rect().addClass("highcharts-plot-border").attr({
					zIndex: 1
				}).add());
				e.attr({
					stroke: a.plotBorderColor,
					"stroke-width": a.plotBorderWidth || 0,
					fill: "none"
				});
				e[v](e.crisp({
					x: w,
					y: p,
					width: t,
					height: G
				}, -e.strokeWidth()));
				this.isDirtyBox = !1;
				d(this, "afterDrawChartBox")
			},
			propFromSeries: function() {
				var a = this,
					b = a.options.chart,
					c, d = a.options.series,
					g, f;
				k(["inverted", "angular", "polar"], function(m) {
					c = G[b.type || b.defaultSeriesType];
					f = b[m] || c && c.prototype[m];
					for(g = d && d.length; !f && g--;)(c = G[d[g].type]) && c.prototype[m] && (f = !0);
					a[m] = f
				})
			},
			linkSeries: function() {
				var a = this,
					b = a.series;
				k(b, function(a) {
					a.linkedSeries.length =
						0
				});
				k(b, function(b) {
					var c = b.options.linkedTo;
					I(c) && (c = ":previous" === c ? a.series[b.index - 1] : a.get(c)) && c.linkedParent !== b && (c.linkedSeries.push(b), b.linkedParent = c, b.visible = D(b.options.visible, c.options.visible, b.visible))
				});
				d(this, "afterLinkSeries")
			},
			renderSeries: function() {
				k(this.series, function(a) {
					a.translate();
					a.render()
				})
			},
			renderLabels: function() {
				var a = this,
					b = a.options.labels;
				b.items && k(b.items, function(c) {
					var d = r(b.style, c.style),
						g = B(d.left) + a.plotLeft,
						f = B(d.top) + a.plotTop + 12;
					delete d.left;
					delete d.top;
					a.renderer.text(c.html, g, f).attr({
						zIndex: 2
					}).css(d).add()
				})
			},
			render: function() {
				var a = this.axes,
					b = this.renderer,
					c = this.options,
					d, g, f;
				this.setTitle();
				this.legend = new t(this, c.legend);
				this.getStacks && this.getStacks();
				this.getMargins(!0);
				this.setChartSize();
				c = this.plotWidth;
				d = this.plotHeight = Math.max(this.plotHeight - 21, 0);
				k(a, function(a) {
					a.setScale()
				});
				this.getAxisMargins();
				g = 1.1 < c / this.plotWidth;
				f = 1.05 < d / this.plotHeight;
				if(g || f) k(a, function(a) {
					(a.horiz && g || !a.horiz && f) && a.setTickInterval(!0)
				}), this.getMargins();
				this.drawChartBox();
				this.hasCartesianSeries && k(a, function(a) {
					a.visible && a.render()
				});
				this.seriesGroup || (this.seriesGroup = b.g("series-group").attr({
					zIndex: 3
				}).add());
				this.renderSeries();
				this.renderLabels();
				this.addCredits();
				this.setResponsive && this.setResponsive();
				this.hasRendered = !0
			},
			addCredits: function(a) {
				var b = this;
				a = A(!0, this.options.credits, a);
				a.enabled && !this.credits && (this.credits = this.renderer.text(a.text + (this.mapCredits || ""), 0, 0).addClass("highcharts-credits").on("click", function() {
					a.href &&
						(P.location.href = a.href)
				}).attr({
					align: a.position.align,
					zIndex: 8
				}).css(a.style).add().align(a.position), this.credits.update = function(a) {
					b.credits = b.credits.destroy();
					b.addCredits(a)
				})
			},
			destroy: function() {
				var b = this,
					c = b.axes,
					g = b.series,
					f = b.container,
					m, e = f && f.parentNode;
				d(b, "destroy");
				b.renderer.forExport ? a.erase(x, b) : x[b.index] = void 0;
				a.chartCount--;
				b.renderTo.removeAttribute("data-highcharts-chart");
				M(b);
				for(m = c.length; m--;) c[m] = c[m].destroy();
				this.scroller && this.scroller.destroy && this.scroller.destroy();
				for(m = g.length; m--;) g[m] = g[m].destroy();
				k("title subtitle chartBackground plotBackground plotBGImage plotBorder seriesGroup clipRect credits pointer rangeSelector legend resetZoomButton tooltip renderer".split(" "), function(a) {
					var c = b[a];
					c && c.destroy && (b[a] = c.destroy())
				});
				f && (f.innerHTML = "", M(f), e && q(f));
				H(b, function(a, c) {
					delete b[c]
				})
			},
			firstRender: function() {
				var a = this,
					b = a.options;
				if(!a.isReadyToRender || a.isReadyToRender()) {
					a.getContainer();
					a.resetMargins();
					a.setChartSize();
					a.propFromSeries();
					a.getAxes();
					k(b.series || [], function(b) {
						a.initSeries(b)
					});
					a.linkSeries();
					d(a, "beforeRender");
					m && (a.pointer = new m(a, b));
					a.render();
					if(!a.renderer.imgCount && a.onload) a.onload();
					a.temporaryDisplay(!0)
				}
			},
			onload: function() {
				k([this.callback].concat(this.callbacks), function(a) {
					a && void 0 !== this.index && a.apply(this, [this])
				}, this);
				d(this, "load");
				d(this, "render");
				c(this.index) && this.setReflow(this.options.chart.reflow);
				this.onload = null
			}
		})
	})(K);
	(function(a) {
		var C = a.addEvent,
			E = a.Chart,
			F = a.each;
		C(E, "afterSetChartSize", function(n) {
			var h =
				this.options.chart.scrollablePlotArea;
			(h = h && h.minWidth) && !this.renderer.forExport && (this.scrollablePixels = h = Math.max(0, h - this.chartWidth)) && (this.plotWidth += h, this.clipBox.width += h, n.skipAxes || F(this.axes, function(e) {
				1 === e.side ? e.getPlotLinePath = function() {
					var h = this.right,
						n;
					this.right = h - e.chart.scrollablePixels;
					n = a.Axis.prototype.getPlotLinePath.apply(this, arguments);
					this.right = h;
					return n
				} : (e.setAxisSize(), e.setAxisTranslation())
			}))
		});
		C(E, "render", function() {
			this.scrollablePixels ? (this.setUpScrolling &&
				this.setUpScrolling(), this.applyFixed()) : this.fixedDiv && this.applyFixed()
		});
		E.prototype.setUpScrolling = function() {
			this.scrollingContainer = a.createElement("div", {
				className: "highcharts-scrolling"
			}, {
				overflowX: "auto",
				WebkitOverflowScrolling: "touch"
			}, this.renderTo);
			this.innerContainer = a.createElement("div", {
				className: "highcharts-inner-container"
			}, null, this.scrollingContainer);
			this.innerContainer.appendChild(this.container);
			this.setUpScrolling = null
		};
		E.prototype.applyFixed = function() {
			var n = this.container,
				h, e, u = !this.fixedDiv;
			u && (this.fixedDiv = a.createElement("div", {
				className: "highcharts-fixed"
			}, {
				position: "absolute",
				overflow: "hidden",
				pointerEvents: "none",
				zIndex: 2
			}, null, !0), this.renderTo.insertBefore(this.fixedDiv, this.renderTo.firstChild), this.fixedRenderer = h = new a.Renderer(this.fixedDiv, 0, 0), this.scrollableMask = h.path().attr({
				fill: a.color(this.options.chart.backgroundColor || "#fff").setOpacity(.85).get(),
				zIndex: -1
			}).addClass("highcharts-scrollable-mask").add(), a.each([this.inverted ? ".highcharts-xaxis" :
				".highcharts-yaxis", this.inverted ? ".highcharts-xaxis-labels" : ".highcharts-yaxis-labels", ".highcharts-contextbutton", ".highcharts-credits", ".highcharts-legend", ".highcharts-subtitle", ".highcharts-title"
			], function(e) {
				a.each(n.querySelectorAll(e), function(a) {
					h.box.appendChild(a);
					a.style.pointerEvents = "auto"
				})
			}));
			this.fixedRenderer.setSize(this.chartWidth, this.chartHeight);
			e = this.chartWidth + this.scrollablePixels;
			this.container.style.width = e + "px";
			this.renderer.boxWrapper.attr({
				width: e,
				height: this.chartHeight,
				viewBox: [0, 0, e, this.chartHeight].join(" ")
			});
			u && (e = this.options.chart.scrollablePlotArea, e.scrollPositionX && (this.scrollingContainer.scrollLeft = this.scrollablePixels * e.scrollPositionX));
			u = this.axisOffset;
			e = this.plotTop - u[0] - 1;
			var u = this.plotTop + this.plotHeight + u[2],
				y = this.plotLeft + this.plotWidth - this.scrollablePixels;
			this.scrollableMask.attr({
				d: this.scrollablePixels ? ["M", 0, e, "L", this.plotLeft - 1, e, "L", this.plotLeft - 1, u, "L", 0, u, "Z", "M", y, e, "L", this.chartWidth, e, "L", this.chartWidth, u, "L", y, u, "Z"] : ["M",
					0, 0
				]
			})
		}
	})(K);
	(function(a) {
		var C, E = a.each,
			F = a.extend,
			n = a.erase,
			h = a.fireEvent,
			e = a.format,
			u = a.isArray,
			y = a.isNumber,
			q = a.pick,
			x = a.removeEvent;
		a.Point = C = function() {};
		a.Point.prototype = {
			init: function(a, c, e) {
				this.series = a;
				this.color = a.color;
				this.applyOptions(c, e);
				a.options.colorByPoint ? (c = a.options.colors || a.chart.options.colors, this.color = this.color || c[a.colorCounter], c = c.length, e = a.colorCounter, a.colorCounter++, a.colorCounter === c && (a.colorCounter = 0)) : e = a.colorIndex;
				this.colorIndex = q(this.colorIndex, e);
				a.chart.pointCount++;
				h(this, "afterInit");
				return this
			},
			applyOptions: function(a, c) {
				var f = this.series,
					e = f.options.pointValKey || f.pointValKey;
				a = C.prototype.optionsToObject.call(this, a);
				F(this, a);
				this.options = this.options ? F(this.options, a) : a;
				a.group && delete this.group;
				e && (this.y = this[e]);
				this.isNull = q(this.isValid && !this.isValid(), null === this.x || !y(this.y, !0));
				this.selected && (this.state = "select");
				"name" in this && void 0 === c && f.xAxis && f.xAxis.hasNames && (this.x = f.xAxis.nameToX(this));
				void 0 === this.x && f && (this.x =
					void 0 === c ? f.autoIncrement(this) : c);
				return this
			},
			setNestedProperty: function(f, c, e) {
				e = e.split(".");
				a.reduce(e, function(f, e, d, b) {
					f[e] = b.length - 1 === d ? c : a.isObject(f[e], !0) ? f[e] : {};
					return f[e]
				}, f);
				return f
			},
			optionsToObject: function(f) {
				var c = {},
					e = this.series,
					h = e.options.keys,
					l = h || e.pointArrayMap || ["y"],
					d = l.length,
					b = 0,
					n = 0;
				if(y(f) || null === f) c[l[0]] = f;
				else if(u(f))
					for(!h && f.length > d && (e = typeof f[0], "string" === e ? c.name = f[0] : "number" === e && (c.x = f[0]), b++); n < d;) h && void 0 === f[b] || (0 < l[n].indexOf(".") ? a.Point.prototype.setNestedProperty(c,
						f[b], l[n]) : c[l[n]] = f[b]), b++, n++;
				else "object" === typeof f && (c = f, f.dataLabels && (e._hasPointLabels = !0), f.marker && (e._hasPointMarkers = !0));
				return c
			},
			getClassName: function() {
				return "highcharts-point" + (this.selected ? " highcharts-point-select" : "") + (this.negative ? " highcharts-negative" : "") + (this.isNull ? " highcharts-null-point" : "") + (void 0 !== this.colorIndex ? " highcharts-color-" + this.colorIndex : "") + (this.options.className ? " " + this.options.className : "") + (this.zone && this.zone.className ? " " + this.zone.className.replace("highcharts-negative",
					"") : "")
			},
			getZone: function() {
				var a = this.series,
					c = a.zones,
					a = a.zoneAxis || "y",
					e = 0,
					h;
				for(h = c[e]; this[a] >= h.value;) h = c[++e];
				this.nonZonedColor || (this.nonZonedColor = this.color);
				this.color = h && h.color && !this.options.color ? h.color : this.nonZonedColor;
				return h
			},
			destroy: function() {
				var a = this.series.chart,
					c = a.hoverPoints,
					e;
				a.pointCount--;
				c && (this.setState(), n(c, this), c.length || (a.hoverPoints = null));
				if(this === a.hoverPoint) this.onMouseOut();
				if(this.graphic || this.dataLabel) x(this), this.destroyElements();
				this.legendItem &&
					a.legend.destroyItem(this);
				for(e in this) this[e] = null
			},
			destroyElements: function() {
				for(var a = ["graphic", "dataLabel", "dataLabelUpper", "connector", "shadowGroup"], c, e = 6; e--;) c = a[e], this[c] && (this[c] = this[c].destroy())
			},
			getLabelConfig: function() {
				return {
					x: this.category,
					y: this.y,
					color: this.color,
					colorIndex: this.colorIndex,
					key: this.name || this.category,
					series: this.series,
					point: this,
					percentage: this.percentage,
					total: this.total || this.stackTotal
				}
			},
			tooltipFormatter: function(a) {
				var c = this.series,
					f = c.tooltipOptions,
					h = q(f.valueDecimals, ""),
					l = f.valuePrefix || "",
					d = f.valueSuffix || "";
				E(c.pointArrayMap || ["y"], function(b) {
					b = "{point." + b;
					if(l || d) a = a.replace(RegExp(b + "}", "g"), l + b + "}" + d);
					a = a.replace(RegExp(b + "}", "g"), b + ":,." + h + "f}")
				});
				return e(a, {
					point: this,
					series: this.series
				}, c.chart.time)
			},
			firePointEvent: function(a, c, e) {
				var f = this,
					l = this.series.options;
				(l.point.events[a] || f.options && f.options.events && f.options.events[a]) && this.importEvents();
				"click" === a && l.allowPointSelect && (e = function(a) {
					f.select && f.select(null, a.ctrlKey ||
						a.metaKey || a.shiftKey)
				});
				h(this, a, c, e)
			},
			visible: !0
		}
	})(K);
	(function(a) {
		var C = a.addEvent,
			E = a.animObject,
			F = a.arrayMax,
			n = a.arrayMin,
			h = a.correctFloat,
			e = a.defaultOptions,
			u = a.defaultPlotOptions,
			y = a.defined,
			q = a.each,
			x = a.erase,
			f = a.extend,
			c = a.fireEvent,
			k = a.grep,
			r = a.isArray,
			l = a.isNumber,
			d = a.isString,
			b = a.merge,
			v = a.objectEach,
			p = a.pick,
			I = a.removeEvent,
			t = a.splat,
			L = a.SVGElement,
			A = a.syncTimeout,
			H = a.win;
		a.Series = a.seriesType("line", null, {
			lineWidth: 2,
			allowPointSelect: !1,
			showCheckbox: !1,
			animation: {
				duration: 1E3
			},
			events: {},
			marker: {
				lineWidth: 0,
				lineColor: "#ffffff",
				enabledThreshold: 2,
				radius: 4,
				states: {
					normal: {
						animation: !0
					},
					hover: {
						animation: {
							duration: 50
						},
						enabled: !0,
						radiusPlus: 2,
						lineWidthPlus: 1
					},
					select: {
						fillColor: "#cccccc",
						lineColor: "#000000",
						lineWidth: 2
					}
				}
			},
			point: {
				events: {}
			},
			dataLabels: {
				align: "center",
				formatter: function() {
					return null === this.y ? "" : a.numberFormat(this.y, -1)
				},
				style: {
					fontSize: "11px",
					fontWeight: "bold",
					color: "contrast",
					textOutline: "1px contrast"
				},
				verticalAlign: "bottom",
				x: 0,
				y: 0,
				padding: 5
			},
			cropThreshold: 300,
			pointRange: 0,
			softThreshold: !0,
			states: {
				normal: {
					animation: !0
				},
				hover: {
					animation: {
						duration: 50
					},
					lineWidthPlus: 1,
					marker: {},
					halo: {
						size: 10,
						opacity: .25
					}
				},
				select: {
					marker: {}
				}
			},
			stickyTracking: !0,
			turboThreshold: 1E3,
			findNearestPointBy: "x"
		}, {
			isCartesian: !0,
			pointClass: a.Point,
			sorted: !0,
			requireSorting: !0,
			directTouch: !1,
			axisTypes: ["xAxis", "yAxis"],
			colorCounter: 0,
			parallelArrays: ["x", "y"],
			coll: "series",
			init: function(a, b) {
				var d = this,
					m, e = a.series,
					g;
				d.chart = a;
				d.options = b = d.setOptions(b);
				d.linkedSeries = [];
				d.bindAxes();
				f(d, {
					name: b.name,
					state: "",
					visible: !1 !== b.visible,
					selected: !0 === b.selected
				});
				m = b.events;
				v(m, function(a, b) {
					C(d, b, a)
				});
				if(m && m.click || b.point && b.point.events && b.point.events.click || b.allowPointSelect) a.runTrackerClick = !0;
				d.getColor();
				d.getSymbol();
				q(d.parallelArrays, function(a) {
					d[a + "Data"] = []
				});
				d.setData(b.data, !1);
				d.isCartesian && (a.hasCartesianSeries = !0);
				e.length && (g = e[e.length - 1]);
				d._i = p(g && g._i, -1) + 1;
				a.orderSeries(this.insert(e));
				c(this, "afterInit")
			},
			insert: function(a) {
				var b = this.options.index,
					c;
				if(l(b)) {
					for(c = a.length; c--;)
						if(b >=
							p(a[c].options.index, a[c]._i)) {
							a.splice(c + 1, 0, this);
							break
						} - 1 === c && a.unshift(this);
					c += 1
				} else a.push(this);
				return p(c, a.length - 1)
			},
			bindAxes: function() {
				var b = this,
					c = b.options,
					d = b.chart,
					f;
				q(b.axisTypes || [], function(m) {
					q(d[m], function(a) {
						f = a.options;
						if(c[m] === f.index || void 0 !== c[m] && c[m] === f.id || void 0 === c[m] && 0 === f.index) b.insert(a.series), b[m] = a, a.isDirty = !0
					});
					b[m] || b.optionalAxis === m || a.error(18, !0)
				})
			},
			updateParallelArrays: function(a, b) {
				var c = a.series,
					d = arguments,
					f = l(b) ? function(d) {
						var g = "y" === d && c.toYData ?
							c.toYData(a) : a[d];
						c[d + "Data"][b] = g
					} : function(a) {
						Array.prototype[b].apply(c[a + "Data"], Array.prototype.slice.call(d, 2))
					};
				q(c.parallelArrays, f)
			},
			autoIncrement: function() {
				var a = this.options,
					b = this.xIncrement,
					c, d = a.pointIntervalUnit,
					f = this.chart.time,
					b = p(b, a.pointStart, 0);
				this.pointInterval = c = p(this.pointInterval, a.pointInterval, 1);
				d && (a = new f.Date(b), "day" === d ? f.set("Date", a, f.get("Date", a) + c) : "month" === d ? f.set("Month", a, f.get("Month", a) + c) : "year" === d && f.set("FullYear", a, f.get("FullYear", a) + c), c = a.getTime() -
					b);
				this.xIncrement = b + c;
				return b
			},
			setOptions: function(a) {
				var d = this.chart,
					f = d.options,
					m = f.plotOptions,
					h = (d.userOptions || {}).plotOptions || {},
					g = m[this.type];
				this.userOptions = a;
				d = b(g, m.series, a);
				this.tooltipOptions = b(e.tooltip, e.plotOptions.series && e.plotOptions.series.tooltip, e.plotOptions[this.type].tooltip, f.tooltip.userOptions, m.series && m.series.tooltip, m[this.type].tooltip, a.tooltip);
				this.stickyTracking = p(a.stickyTracking, h[this.type] && h[this.type].stickyTracking, h.series && h.series.stickyTracking,
					this.tooltipOptions.shared && !this.noSharedTooltip ? !0 : d.stickyTracking);
				null === g.marker && delete d.marker;
				this.zoneAxis = d.zoneAxis;
				a = this.zones = (d.zones || []).slice();
				!d.negativeColor && !d.negativeFillColor || d.zones || a.push({
					value: d[this.zoneAxis + "Threshold"] || d.threshold || 0,
					className: "highcharts-negative",
					color: d.negativeColor,
					fillColor: d.negativeFillColor
				});
				a.length && y(a[a.length - 1].value) && a.push({
					color: this.color,
					fillColor: this.fillColor
				});
				c(this, "afterSetOptions", {
					options: d
				});
				return d
			},
			getName: function() {
				return this.name ||
					"Series " + (this.index + 1)
			},
			getCyclic: function(a, b, c) {
				var d, f = this.chart,
					g = this.userOptions,
					m = a + "Index",
					e = a + "Counter",
					h = c ? c.length : p(f.options.chart[a + "Count"], f[a + "Count"]);
				b || (d = p(g[m], g["_" + m]), y(d) || (f.series.length || (f[e] = 0), g["_" + m] = d = f[e] % h, f[e] += 1), c && (b = c[d]));
				void 0 !== d && (this[m] = d);
				this[a] = b
			},
			getColor: function() {
				this.options.colorByPoint ? this.options.color = null : this.getCyclic("color", this.options.color || u[this.type].color, this.chart.options.colors)
			},
			getSymbol: function() {
				this.getCyclic("symbol",
					this.options.marker.symbol, this.chart.options.symbols)
			},
			drawLegendSymbol: a.LegendSymbolMixin.drawLineMarker,
			updateData: function(b) {
				var c = this.options,
					d = this.points,
					f = [],
					m, g, e, h = this.requireSorting;
				q(b, function(b) {
					var g;
					g = a.defined(b) && this.pointClass.prototype.optionsToObject.call({
						series: this
					}, b).x;
					l(g) && (g = a.inArray(g, this.xData, e), -1 === g ? f.push(b) : b !== c.data[g] ? (d[g].update(b, !1, null, !1), d[g].touched = !0, h && (e = g)) : d[g] && (d[g].touched = !0), m = !0)
				}, this);
				if(m)
					for(b = d.length; b--;) g = d[b], g.touched || g.remove(!1),
						g.touched = !1;
				else if(b.length === d.length) q(b, function(a, b) {
					d[b].update && a !== c.data[b] && d[b].update(a, !1, null, !1)
				});
				else return !1;
				q(f, function(a) {
					this.addPoint(a, !1)
				}, this);
				return !0
			},
			setData: function(b, c, f, e) {
				var m = this,
					g = m.points,
					h = g && g.length || 0,
					k, B = m.options,
					D = m.chart,
					t = null,
					A = m.xAxis,
					n = B.turboThreshold,
					v = this.xData,
					u = this.yData,
					y = (k = m.pointArrayMap) && k.length,
					H;
				b = b || [];
				k = b.length;
				c = p(c, !0);
				!1 !== e && k && h && !m.cropped && !m.hasGroupedData && m.visible && (H = this.updateData(b));
				if(!H) {
					m.xIncrement = null;
					m.colorCounter =
						0;
					q(this.parallelArrays, function(a) {
						m[a + "Data"].length = 0
					});
					if(n && k > n) {
						for(f = 0; null === t && f < k;) t = b[f], f++;
						if(l(t))
							for(f = 0; f < k; f++) v[f] = this.autoIncrement(), u[f] = b[f];
						else if(r(t))
							if(y)
								for(f = 0; f < k; f++) t = b[f], v[f] = t[0], u[f] = t.slice(1, y + 1);
							else
								for(f = 0; f < k; f++) t = b[f], v[f] = t[0], u[f] = t[1];
						else a.error(12)
					} else
						for(f = 0; f < k; f++) void 0 !== b[f] && (t = {
							series: m
						}, m.pointClass.prototype.applyOptions.apply(t, [b[f]]), m.updateParallelArrays(t, f));
					u && d(u[0]) && a.error(14, !0);
					m.data = [];
					m.options.data = m.userOptions.data =
						b;
					for(f = h; f--;) g[f] && g[f].destroy && g[f].destroy();
					A && (A.minRange = A.userMinRange);
					m.isDirty = D.isDirtyBox = !0;
					m.isDirtyData = !!g;
					f = !1
				}
				"point" === B.legendType && (this.processData(), this.generatePoints());
				c && D.redraw(f)
			},
			processData: function(b) {
				var c = this.xData,
					d = this.yData,
					f = c.length,
					m;
				m = 0;
				var g, e, h = this.xAxis,
					l, k = this.options;
				l = k.cropThreshold;
				var p = this.getExtremesFromAll || k.getExtremesFromAll,
					r = this.isCartesian,
					k = h && h.val2lin,
					t = h && h.isLog,
					A = this.requireSorting,
					n, q;
				if(r && !this.isDirty && !h.isDirty && !this.yAxis.isDirty &&
					!b) return !1;
				h && (b = h.getExtremes(), n = b.min, q = b.max);
				if(r && this.sorted && !p && (!l || f > l || this.forceCrop))
					if(c[f - 1] < n || c[0] > q) c = [], d = [];
					else if(c[0] < n || c[f - 1] > q) m = this.cropData(this.xData, this.yData, n, q), c = m.xData, d = m.yData, m = m.start, g = !0;
				for(l = c.length || 1; --l;) f = t ? k(c[l]) - k(c[l - 1]) : c[l] - c[l - 1], 0 < f && (void 0 === e || f < e) ? e = f : 0 > f && A && (a.error(15), A = !1);
				this.cropped = g;
				this.cropStart = m;
				this.processedXData = c;
				this.processedYData = d;
				this.closestPointRange = e
			},
			cropData: function(a, b, c, d, f) {
				var g = a.length,
					m = 0,
					e = g,
					h;
				f =
					p(f, this.cropShoulder, 1);
				for(h = 0; h < g; h++)
					if(a[h] >= c) {
						m = Math.max(0, h - f);
						break
					}
				for(c = h; c < g; c++)
					if(a[c] > d) {
						e = c + f;
						break
					}
				return {
					xData: a.slice(m, e),
					yData: b.slice(m, e),
					start: m,
					end: e
				}
			},
			generatePoints: function() {
				var a = this.options,
					b = a.data,
					c = this.data,
					d, f = this.processedXData,
					g = this.processedYData,
					e = this.pointClass,
					h = f.length,
					l = this.cropStart || 0,
					k, p = this.hasGroupedData,
					a = a.keys,
					r, n = [],
					A;
				c || p || (c = [], c.length = b.length, c = this.data = c);
				a && p && (this.options.keys = !1);
				for(A = 0; A < h; A++) k = l + A, p ? (r = (new e).init(this, [f[A]].concat(t(g[A]))),
					r.dataGroup = this.groupMap[A]) : (r = c[k]) || void 0 === b[k] || (c[k] = r = (new e).init(this, b[k], f[A])), r && (r.index = k, n[A] = r);
				this.options.keys = a;
				if(c && (h !== (d = c.length) || p))
					for(A = 0; A < d; A++) A !== l || p || (A += h), c[A] && (c[A].destroyElements(), c[A].plotX = void 0);
				this.data = c;
				this.points = n
			},
			getExtremes: function(a) {
				var b = this.yAxis,
					c = this.processedXData,
					d, f = [],
					g = 0;
				d = this.xAxis.getExtremes();
				var m = d.min,
					e = d.max,
					h, k, p = this.requireSorting ? 1 : 0,
					t, A;
				a = a || this.stackedYData || this.processedYData || [];
				d = a.length;
				for(A = 0; A < d; A++)
					if(k =
						c[A], t = a[A], h = (l(t, !0) || r(t)) && (!b.positiveValuesOnly || t.length || 0 < t), k = this.getExtremesFromAll || this.options.getExtremesFromAll || this.cropped || (c[A + p] || k) >= m && (c[A - p] || k) <= e, h && k)
						if(h = t.length)
							for(; h--;) "number" === typeof t[h] && (f[g++] = t[h]);
						else f[g++] = t;
				this.dataMin = n(f);
				this.dataMax = F(f)
			},
			translate: function() {
				this.processedXData || this.processData();
				this.generatePoints();
				var a = this.options,
					b = a.stacking,
					d = this.xAxis,
					f = d.categories,
					e = this.yAxis,
					g = this.points,
					k = g.length,
					r = !!this.modifyValue,
					t = a.pointPlacement,
					A = "between" === t || l(t),
					n = a.threshold,
					q = a.startFromThreshold ? n : 0,
					v, u, H, x, I = Number.MAX_VALUE;
				"between" === t && (t = .5);
				l(t) && (t *= p(a.pointRange || d.pointRange));
				for(a = 0; a < k; a++) {
					var L = g[a],
						C = L.x,
						E = L.y;
					u = L.low;
					var F = b && e.stacks[(this.negStacks && E < (q ? 0 : n) ? "-" : "") + this.stackKey],
						K;
					e.positiveValuesOnly && null !== E && 0 >= E && (L.isNull = !0);
					L.plotX = v = h(Math.min(Math.max(-1E5, d.translate(C, 0, 0, 0, 1, t, "flags" === this.type)), 1E5));
					b && this.visible && !L.isNull && F && F[C] && (x = this.getStackIndicator(x, C, this.index), K = F[C], E = K.points[x.key],
						u = E[0], E = E[1], u === q && x.key === F[C].base && (u = p(l(n) && n, e.min)), e.positiveValuesOnly && 0 >= u && (u = null), L.total = L.stackTotal = K.total, L.percentage = K.total && L.y / K.total * 100, L.stackY = E, K.setOffset(this.pointXOffset || 0, this.barW || 0));
					L.yBottom = y(u) ? Math.min(Math.max(-1E5, e.translate(u, 0, 1, 0, 1)), 1E5) : null;
					r && (E = this.modifyValue(E, L));
					L.plotY = u = "number" === typeof E && Infinity !== E ? Math.min(Math.max(-1E5, e.translate(E, 0, 1, 0, 1)), 1E5) : void 0;
					L.isInside = void 0 !== u && 0 <= u && u <= e.len && 0 <= v && v <= d.len;
					L.clientX = A ? h(d.translate(C,
						0, 0, 0, 1, t)) : v;
					L.negative = L.y < (n || 0);
					L.category = f && void 0 !== f[L.x] ? f[L.x] : L.x;
					L.isNull || (void 0 !== H && (I = Math.min(I, Math.abs(v - H))), H = v);
					L.zone = this.zones.length && L.getZone()
				}
				this.closestPointRangePx = I;
				c(this, "afterTranslate")
			},
			getValidPoints: function(a, b) {
				var c = this.chart;
				return k(a || this.points || [], function(a) {
					return b && !c.isInsidePlot(a.plotX, a.plotY, c.inverted) ? !1 : !a.isNull
				})
			},
			setClip: function(a) {
				var b = this.chart,
					c = this.options,
					d = b.renderer,
					f = b.inverted,
					g = this.clipBox,
					e = g || b.clipBox,
					m = this.sharedClipKey || ["_sharedClip", a && a.duration, a && a.easing, e.height, c.xAxis, c.yAxis].join(),
					h = b[m],
					l = b[m + "m"];
				h || (a && (e.width = 0, f && (e.x = b.plotSizeX), b[m + "m"] = l = d.clipRect(f ? b.plotSizeX + 99 : -99, f ? -b.plotLeft : -b.plotTop, 99, f ? b.chartWidth : b.chartHeight)), b[m] = h = d.clipRect(e), h.count = {
					length: 0
				});
				a && !h.count[this.index] && (h.count[this.index] = !0, h.count.length += 1);
				!1 !== c.clip && (this.group.clip(a || g ? h : b.clipRect), this.markerGroup.clip(l), this.sharedClipKey = m);
				a || (h.count[this.index] && (delete h.count[this.index], --h.count.length),
					0 === h.count.length && m && b[m] && (g || (b[m] = b[m].destroy()), b[m + "m"] && (b[m + "m"] = b[m + "m"].destroy())))
			},
			animate: function(a) {
				var b = this.chart,
					c = E(this.options.animation),
					d;
				a ? this.setClip(c) : (d = this.sharedClipKey, (a = b[d]) && a.animate({
					width: b.plotSizeX,
					x: 0
				}, c), b[d + "m"] && b[d + "m"].animate({
					width: b.plotSizeX + 99,
					x: 0
				}, c), this.animate = null)
			},
			afterAnimate: function() {
				this.setClip();
				c(this, "afterAnimate");
				this.finishedAnimating = !0
			},
			drawPoints: function() {
				var a = this.points,
					b = this.chart,
					c, d, f, g, e = this.options.marker,
					h, l, k, r = this[this.specialGroup] || this.markerGroup,
					t, A = p(e.enabled, this.xAxis.isRadial ? !0 : null, this.closestPointRangePx >= e.enabledThreshold * e.radius);
				if(!1 !== e.enabled || this._hasPointMarkers)
					for(c = 0; c < a.length; c++) d = a[c], g = d.graphic, h = d.marker || {}, l = !!d.marker, f = A && void 0 === h.enabled || h.enabled, k = d.isInside, f && !d.isNull ? (f = p(h.symbol, this.symbol), t = this.markerAttribs(d, d.selected && "select"), g ? g[k ? "show" : "hide"](!0).animate(t) : k && (0 < t.width || d.hasImage) && (d.graphic = g = b.renderer.symbol(f, t.x, t.y, t.width,
						t.height, l ? h : e).add(r)), g && g.attr(this.pointAttribs(d, d.selected && "select")), g && g.addClass(d.getClassName(), !0)) : g && (d.graphic = g.destroy())
			},
			markerAttribs: function(a, b) {
				var c = this.options.marker,
					d = a.marker || {},
					f = d.symbol || c.symbol,
					g = p(d.radius, c.radius);
				b && (c = c.states[b], b = d.states && d.states[b], g = p(b && b.radius, c && c.radius, g + (c && c.radiusPlus || 0)));
				a.hasImage = f && 0 === f.indexOf("url");
				a.hasImage && (g = 0);
				a = {
					x: Math.floor(a.plotX) - g,
					y: a.plotY - g
				};
				g && (a.width = a.height = 2 * g);
				return a
			},
			pointAttribs: function(a,
				b) {
				var c = this.options.marker,
					d = a && a.options,
					f = d && d.marker || {},
					g = this.color,
					e = d && d.color,
					m = a && a.color,
					d = p(f.lineWidth, c.lineWidth);
				a = a && a.zone && a.zone.color;
				g = e || a || m || g;
				a = f.fillColor || c.fillColor || g;
				g = f.lineColor || c.lineColor || g;
				b && (c = c.states[b], b = f.states && f.states[b] || {}, d = p(b.lineWidth, c.lineWidth, d + p(b.lineWidthPlus, c.lineWidthPlus, 0)), a = b.fillColor || c.fillColor || a, g = b.lineColor || c.lineColor || g);
				return {
					stroke: g,
					"stroke-width": d,
					fill: a
				}
			},
			destroy: function() {
				var b = this,
					d = b.chart,
					f = /AppleWebKit\/533/.test(H.navigator.userAgent),
					e, h, g = b.data || [],
					l, k;
				c(b, "destroy");
				I(b);
				q(b.axisTypes || [], function(a) {
					(k = b[a]) && k.series && (x(k.series, b), k.isDirty = k.forceRedraw = !0)
				});
				b.legendItem && b.chart.legend.destroyItem(b);
				for(h = g.length; h--;)(l = g[h]) && l.destroy && l.destroy();
				b.points = null;
				a.clearTimeout(b.animationTimeout);
				v(b, function(a, b) {
					a instanceof L && !a.survive && (e = f && "group" === b ? "hide" : "destroy", a[e]())
				});
				d.hoverSeries === b && (d.hoverSeries = null);
				x(d.series, b);
				d.orderSeries();
				v(b, function(a, c) {
					delete b[c]
				})
			},
			getGraphPath: function(a, b,
				c) {
				var d = this,
					f = d.options,
					g = f.step,
					e, m = [],
					h = [],
					l;
				a = a || d.points;
				(e = a.reversed) && a.reverse();
				(g = {
					right: 1,
					center: 2
				}[g] || g && 3) && e && (g = 4 - g);
				!f.connectNulls || b || c || (a = this.getValidPoints(a));
				q(a, function(e, k) {
					var p = e.plotX,
						r = e.plotY,
						t = a[k - 1];
					(e.leftCliff || t && t.rightCliff) && !c && (l = !0);
					e.isNull && !y(b) && 0 < k ? l = !f.connectNulls : e.isNull && !b ? l = !0 : (0 === k || l ? k = ["M", e.plotX, e.plotY] : d.getPointSpline ? k = d.getPointSpline(a, e, k) : g ? (k = 1 === g ? ["L", t.plotX, r] : 2 === g ? ["L", (t.plotX + p) / 2, t.plotY, "L", (t.plotX + p) / 2, r] : ["L", p,
						t.plotY
					], k.push("L", p, r)) : k = ["L", p, r], h.push(e.x), g && (h.push(e.x), 2 === g && h.push(e.x)), m.push.apply(m, k), l = !1)
				});
				m.xMap = h;
				return d.graphPath = m
			},
			drawGraph: function() {
				var a = this,
					b = this.options,
					c = (this.gappedPath || this.getGraphPath).call(this),
					d = [
						["graph", "highcharts-graph", b.lineColor || this.color, b.dashStyle]
					],
					d = a.getZonesGraphs(d);
				q(d, function(d, f) {
					var g = d[0],
						e = a[g];
					e ? (e.endX = a.preventGraphAnimation ? null : c.xMap, e.animate({
						d: c
					})) : c.length && (a[g] = a.chart.renderer.path(c).addClass(d[1]).attr({
							zIndex: 1
						}).add(a.group),
						e = {
							stroke: d[2],
							"stroke-width": b.lineWidth,
							fill: a.fillGraph && a.color || "none"
						}, d[3] ? e.dashstyle = d[3] : "square" !== b.linecap && (e["stroke-linecap"] = e["stroke-linejoin"] = "round"), e = a[g].attr(e).shadow(2 > f && b.shadow));
					e && (e.startX = c.xMap, e.isArea = c.isArea)
				})
			},
			getZonesGraphs: function(a) {
				q(this.zones, function(b, c) {
					a.push(["zone-graph-" + c, "highcharts-graph highcharts-zone-graph-" + c + " " + (b.className || ""), b.color || this.color, b.dashStyle || this.options.dashStyle])
				}, this);
				return a
			},
			applyZones: function() {
				var a = this,
					b = this.chart,
					c = b.renderer,
					d = this.zones,
					f, g, e = this.clips || [],
					h, l = this.graph,
					k = this.area,
					r = Math.max(b.chartWidth, b.chartHeight),
					t = this[(this.zoneAxis || "y") + "Axis"],
					A, n, v = b.inverted,
					u, H, y, x, I = !1;
				d.length && (l || k) && t && void 0 !== t.min && (n = t.reversed, u = t.horiz, l && !this.showLine && l.hide(), k && k.hide(), A = t.getExtremes(), q(d, function(d, m) {
					f = n ? u ? b.plotWidth : 0 : u ? 0 : t.toPixels(A.min);
					f = Math.min(Math.max(p(g, f), 0), r);
					g = Math.min(Math.max(Math.round(t.toPixels(p(d.value, A.max), !0)), 0), r);
					I && (f = g = t.toPixels(A.max));
					H = Math.abs(f - g);
					y = Math.min(f, g);
					x = Math.max(f, g);
					t.isXAxis ? (h = {
						x: v ? x : y,
						y: 0,
						width: H,
						height: r
					}, u || (h.x = b.plotHeight - h.x)) : (h = {
						x: 0,
						y: v ? x : y,
						width: r,
						height: H
					}, u && (h.y = b.plotWidth - h.y));
					v && c.isVML && (h = t.isXAxis ? {
						x: 0,
						y: n ? y : x,
						height: h.width,
						width: b.chartWidth
					} : {
						x: h.y - b.plotLeft - b.spacingBox.x,
						y: 0,
						width: h.height,
						height: b.chartHeight
					});
					e[m] ? e[m].animate(h) : (e[m] = c.clipRect(h), l && a["zone-graph-" + m].clip(e[m]), k && a["zone-area-" + m].clip(e[m]));
					I = d.value > A.max;
					a.resetZones && 0 === g && (g = void 0)
				}), this.clips = e)
			},
			invertGroups: function(a) {
				function b() {
					q(["group",
						"markerGroup"
					], function(b) {
						c[b] && (d.renderer.isVML && c[b].attr({
							width: c.yAxis.len,
							height: c.xAxis.len
						}), c[b].width = c.yAxis.len, c[b].height = c.xAxis.len, c[b].invert(a))
					})
				}
				var c = this,
					d = c.chart,
					f;
				c.xAxis && (f = C(d, "resize", b), C(c, "destroy", f), b(a), c.invertGroups = b)
			},
			plotGroup: function(a, b, c, d, f) {
				var g = this[a],
					e = !g;
				e && (this[a] = g = this.chart.renderer.g().attr({
					zIndex: d || .1
				}).add(f));
				g.addClass("highcharts-" + b + " highcharts-series-" + this.index + " highcharts-" + this.type + "-series " + (y(this.colorIndex) ? "highcharts-color-" +
					this.colorIndex + " " : "") + (this.options.className || "") + (g.hasClass("highcharts-tracker") ? " highcharts-tracker" : ""), !0);
				g.attr({
					visibility: c
				})[e ? "attr" : "animate"](this.getPlotBox());
				return g
			},
			getPlotBox: function() {
				var a = this.chart,
					b = this.xAxis,
					c = this.yAxis;
				a.inverted && (b = c, c = this.xAxis);
				return {
					translateX: b ? b.left : a.plotLeft,
					translateY: c ? c.top : a.plotTop,
					scaleX: 1,
					scaleY: 1
				}
			},
			render: function() {
				var a = this,
					b = a.chart,
					d, f = a.options,
					e = !!a.animate && b.renderer.isSVG && E(f.animation).duration,
					g = a.visible ? "inherit" :
					"hidden",
					h = f.zIndex,
					l = a.hasRendered,
					k = b.seriesGroup,
					r = b.inverted;
				d = a.plotGroup("group", "series", g, h, k);
				a.markerGroup = a.plotGroup("markerGroup", "markers", g, h, k);
				e && a.animate(!0);
				d.inverted = a.isCartesian ? r : !1;
				a.drawGraph && (a.drawGraph(), a.applyZones());
				a.drawDataLabels && a.drawDataLabels();
				a.visible && a.drawPoints();
				a.drawTracker && !1 !== a.options.enableMouseTracking && a.drawTracker();
				a.invertGroups(r);
				!1 === f.clip || a.sharedClipKey || l || d.clip(b.clipRect);
				e && a.animate();
				l || (a.animationTimeout = A(function() {
						a.afterAnimate()
					},
					e));
				a.isDirty = !1;
				a.hasRendered = !0;
				c(a, "afterRender")
			},
			redraw: function() {
				var a = this.chart,
					b = this.isDirty || this.isDirtyData,
					c = this.group,
					d = this.xAxis,
					f = this.yAxis;
				c && (a.inverted && c.attr({
					width: a.plotWidth,
					height: a.plotHeight
				}), c.animate({
					translateX: p(d && d.left, a.plotLeft),
					translateY: p(f && f.top, a.plotTop)
				}));
				this.translate();
				this.render();
				b && delete this.kdTree
			},
			kdAxisArray: ["clientX", "plotY"],
			searchPoint: function(a, b) {
				var c = this.xAxis,
					d = this.yAxis,
					f = this.chart.inverted;
				return this.searchKDTree({
					clientX: f ?
						c.len - a.chartY + c.pos : a.chartX - c.pos,
					plotY: f ? d.len - a.chartX + d.pos : a.chartY - d.pos
				}, b)
			},
			buildKDTree: function() {
				function a(c, d, f) {
					var g, e;
					if(e = c && c.length) return g = b.kdAxisArray[d % f], c.sort(function(a, b) {
						return a[g] - b[g]
					}), e = Math.floor(e / 2), {
						point: c[e],
						left: a(c.slice(0, e), d + 1, f),
						right: a(c.slice(e + 1), d + 1, f)
					}
				}
				this.buildingKdTree = !0;
				var b = this,
					c = -1 < b.options.findNearestPointBy.indexOf("y") ? 2 : 1;
				delete b.kdTree;
				A(function() {
						b.kdTree = a(b.getValidPoints(null, !b.directTouch), c, c);
						b.buildingKdTree = !1
					}, b.options.kdNow ?
					0 : 1)
			},
			searchKDTree: function(a, b) {
				function c(a, b, h, m) {
					var l = b.point,
						k = d.kdAxisArray[h % m],
						r, p, t = l;
					p = y(a[f]) && y(l[f]) ? Math.pow(a[f] - l[f], 2) : null;
					r = y(a[g]) && y(l[g]) ? Math.pow(a[g] - l[g], 2) : null;
					r = (p || 0) + (r || 0);
					l.dist = y(r) ? Math.sqrt(r) : Number.MAX_VALUE;
					l.distX = y(p) ? Math.sqrt(p) : Number.MAX_VALUE;
					k = a[k] - l[k];
					r = 0 > k ? "left" : "right";
					p = 0 > k ? "right" : "left";
					b[r] && (r = c(a, b[r], h + 1, m), t = r[e] < t[e] ? r : l);
					b[p] && Math.sqrt(k * k) < t[e] && (a = c(a, b[p], h + 1, m), t = a[e] < t[e] ? a : t);
					return t
				}
				var d = this,
					f = this.kdAxisArray[0],
					g = this.kdAxisArray[1],
					e = b ? "distX" : "dist";
				b = -1 < d.options.findNearestPointBy.indexOf("y") ? 2 : 1;
				this.kdTree || this.buildingKdTree || this.buildKDTree();
				if(this.kdTree) return c(a, this.kdTree, b, b)
			}
		})
	})(K);
	(function(a) {
		var C = a.Axis,
			E = a.Chart,
			F = a.correctFloat,
			n = a.defined,
			h = a.destroyObjectProperties,
			e = a.each,
			u = a.format,
			y = a.objectEach,
			q = a.pick,
			x = a.Series;
		a.StackItem = function(a, c, e, h, l) {
			var d = a.chart.inverted;
			this.axis = a;
			this.isNegative = e;
			this.options = c;
			this.x = h;
			this.total = null;
			this.points = {};
			this.stack = l;
			this.rightCliff = this.leftCliff =
				0;
			this.alignOptions = {
				align: c.align || (d ? e ? "left" : "right" : "center"),
				verticalAlign: c.verticalAlign || (d ? "middle" : e ? "bottom" : "top"),
				y: q(c.y, d ? 4 : e ? 14 : -6),
				x: q(c.x, d ? e ? -6 : 6 : 0)
			};
			this.textAlign = c.textAlign || (d ? e ? "right" : "left" : "center")
		};
		a.StackItem.prototype = {
			destroy: function() {
				h(this, this.axis)
			},
			render: function(a) {
				var c = this.axis.chart,
					f = this.options,
					e = f.format,
					e = e ? u(e, this, c.time) : f.formatter.call(this);
				this.label ? this.label.attr({
					text: e,
					visibility: "hidden"
				}) : this.label = c.renderer.text(e, null, null, f.useHTML).css(f.style).attr({
					align: this.textAlign,
					rotation: f.rotation,
					visibility: "hidden"
				}).add(a)
			},
			setOffset: function(a, c) {
				var f = this.axis,
					e = f.chart,
					h = f.translate(f.usePercentage ? 100 : this.total, 0, 0, 0, 1),
					d = f.translate(0),
					d = Math.abs(h - d);
				a = e.xAxis[0].translate(this.x) + a;
				f = this.getStackBox(e, this, a, h, c, d, f);
				if(c = this.label) c.align(this.alignOptions, null, f), f = c.alignAttr, c[!1 === this.options.crop || e.isInsidePlot(f.x, f.y) ? "show" : "hide"](!0)
			},
			getStackBox: function(a, c, e, h, l, d, b) {
				var f = c.axis.reversed,
					k = a.inverted;
				a = b.height + b.pos - (k ? a.plotLeft : a.plotTop);
				c = c.isNegative && !f || !c.isNegative && f;
				return {
					x: k ? c ? h : h - d : e,
					y: k ? a - e - l : c ? a - h - d : a - h,
					width: k ? d : l,
					height: k ? l : d
				}
			}
		};
		E.prototype.getStacks = function() {
			var a = this;
			e(a.yAxis, function(a) {
				a.stacks && a.hasVisibleSeries && (a.oldStacks = a.stacks)
			});
			e(a.series, function(c) {
				!c.options.stacking || !0 !== c.visible && !1 !== a.options.chart.ignoreHiddenSeries || (c.stackKey = c.type + q(c.options.stack, ""))
			})
		};
		C.prototype.buildStacks = function() {
			var a = this.series,
				c = q(this.options.reversedStacks, !0),
				e = a.length,
				h;
			if(!this.isXAxis) {
				this.usePercentage = !1;
				for(h = e; h--;) a[c ? h : e - h - 1].setStackedPoints();
				for(h = 0; h < e; h++) a[h].modifyStacks()
			}
		};
		C.prototype.renderStackTotals = function() {
			var a = this.chart,
				c = a.renderer,
				e = this.stacks,
				h = this.stackTotalGroup;
			h || (this.stackTotalGroup = h = c.g("stack-labels").attr({
				visibility: "visible",
				zIndex: 6
			}).add());
			h.translate(a.plotLeft, a.plotTop);
			y(e, function(a) {
				y(a, function(a) {
					a.render(h)
				})
			})
		};
		C.prototype.resetStacks = function() {
			var a = this,
				c = a.stacks;
			a.isXAxis || y(c, function(c) {
				y(c, function(f, e) {
					f.touched < a.stacksTouched ? (f.destroy(),
						delete c[e]) : (f.total = null, f.cumulative = null)
				})
			})
		};
		C.prototype.cleanStacks = function() {
			var a;
			this.isXAxis || (this.oldStacks && (a = this.stacks = this.oldStacks), y(a, function(a) {
				y(a, function(a) {
					a.cumulative = a.total
				})
			}))
		};
		x.prototype.setStackedPoints = function() {
			if(this.options.stacking && (!0 === this.visible || !1 === this.chart.options.chart.ignoreHiddenSeries)) {
				var f = this.processedXData,
					c = this.processedYData,
					e = [],
					h = c.length,
					l = this.options,
					d = l.threshold,
					b = q(l.startFromThreshold && d, 0),
					v = l.stack,
					l = l.stacking,
					p = this.stackKey,
					u = "-" + p,
					t = this.negStacks,
					y = this.yAxis,
					A = y.stacks,
					H = y.oldStacks,
					m, D, B, x, G, g, w;
				y.stacksTouched += 1;
				for(G = 0; G < h; G++) g = f[G], w = c[G], m = this.getStackIndicator(m, g, this.index), x = m.key, B = (D = t && w < (b ? 0 : d)) ? u : p, A[B] || (A[B] = {}), A[B][g] || (H[B] && H[B][g] ? (A[B][g] = H[B][g], A[B][g].total = null) : A[B][g] = new a.StackItem(y, y.options.stackLabels, D, g, v)), B = A[B][g], null !== w ? (B.points[x] = B.points[this.index] = [q(B.cumulative, b)], n(B.cumulative) || (B.base = x), B.touched = y.stacksTouched, 0 < m.index && !1 === this.singleStacks && (B.points[x][0] =
					B.points[this.index + "," + g + ",0"][0])) : B.points[x] = B.points[this.index] = null, "percent" === l ? (D = D ? p : u, t && A[D] && A[D][g] ? (D = A[D][g], B.total = D.total = Math.max(D.total, B.total) + Math.abs(w) || 0) : B.total = F(B.total + (Math.abs(w) || 0))) : B.total = F(B.total + (w || 0)), B.cumulative = q(B.cumulative, b) + (w || 0), null !== w && (B.points[x].push(B.cumulative), e[G] = B.cumulative);
				"percent" === l && (y.usePercentage = !0);
				this.stackedYData = e;
				y.oldStacks = {}
			}
		};
		x.prototype.modifyStacks = function() {
			var a = this,
				c = a.stackKey,
				h = a.yAxis.stacks,
				r = a.processedXData,
				l, d = a.options.stacking;
			a[d + "Stacker"] && e([c, "-" + c], function(b) {
				for(var c = r.length, f, e; c--;)
					if(f = r[c], l = a.getStackIndicator(l, f, a.index, b), e = (f = h[b] && h[b][f]) && f.points[l.key]) a[d + "Stacker"](e, f, c)
			})
		};
		x.prototype.percentStacker = function(a, c, e) {
			c = c.total ? 100 / c.total : 0;
			a[0] = F(a[0] * c);
			a[1] = F(a[1] * c);
			this.stackedYData[e] = a[1]
		};
		x.prototype.getStackIndicator = function(a, c, e, h) {
			!n(a) || a.x !== c || h && a.key !== h ? a = {
				x: c,
				index: 0,
				key: h
			} : a.index++;
			a.key = [e, c, a.index].join();
			return a
		}
	})(K);
	(function(a) {
		var C = a.addEvent,
			E = a.animate,
			F = a.Axis,
			n = a.createElement,
			h = a.css,
			e = a.defined,
			u = a.each,
			y = a.erase,
			q = a.extend,
			x = a.fireEvent,
			f = a.inArray,
			c = a.isNumber,
			k = a.isObject,
			r = a.isArray,
			l = a.merge,
			d = a.objectEach,
			b = a.pick,
			v = a.Point,
			p = a.Series,
			I = a.seriesTypes,
			t = a.setAnimation,
			L = a.splat;
		q(a.Chart.prototype, {
			addSeries: function(a, c, d) {
				var f, e = this;
				a && (c = b(c, !0), x(e, "addSeries", {
					options: a
				}, function() {
					f = e.initSeries(a);
					e.isDirtyLegend = !0;
					e.linkSeries();
					x(e, "afterAddSeries");
					c && e.redraw(d)
				}));
				return f
			},
			addAxis: function(a, c, d, f) {
				var e = c ? "xAxis" :
					"yAxis",
					h = this.options;
				a = l(a, {
					index: this[e].length,
					isX: c
				});
				c = new F(this, a);
				h[e] = L(h[e] || {});
				h[e].push(a);
				b(d, !0) && this.redraw(f);
				return c
			},
			showLoading: function(a) {
				var b = this,
					c = b.options,
					d = b.loadingDiv,
					f = c.loading,
					e = function() {
						d && h(d, {
							left: b.plotLeft + "px",
							top: b.plotTop + "px",
							width: b.plotWidth + "px",
							height: b.plotHeight + "px"
						})
					};
				d || (b.loadingDiv = d = n("div", {
					className: "highcharts-loading highcharts-loading-hidden"
				}, null, b.container), b.loadingSpan = n("span", {
					className: "highcharts-loading-inner"
				}, null, d), C(b,
					"redraw", e));
				d.className = "highcharts-loading";
				b.loadingSpan.innerHTML = a || c.lang.loading;
				h(d, q(f.style, {
					zIndex: 10
				}));
				h(b.loadingSpan, f.labelStyle);
				b.loadingShown || (h(d, {
					opacity: 0,
					display: ""
				}), E(d, {
					opacity: f.style.opacity || .5
				}, {
					duration: f.showDuration || 0
				}));
				b.loadingShown = !0;
				e()
			},
			hideLoading: function() {
				var a = this.options,
					b = this.loadingDiv;
				b && (b.className = "highcharts-loading highcharts-loading-hidden", E(b, {
					opacity: 0
				}, {
					duration: a.loading.hideDuration || 100,
					complete: function() {
						h(b, {
							display: "none"
						})
					}
				}));
				this.loadingShown = !1
			},
			propsRequireDirtyBox: "backgroundColor borderColor borderWidth margin marginTop marginRight marginBottom marginLeft spacing spacingTop spacingRight spacingBottom spacingLeft borderRadius plotBackgroundColor plotBackgroundImage plotBorderColor plotBorderWidth plotShadow shadow".split(" "),
			propsRequireUpdateSeries: "chart.inverted chart.polar chart.ignoreHiddenSeries chart.type colors plotOptions time tooltip".split(" "),
			update: function(a, h, m, k) {
				var t = this,
					p = {
						credits: "addCredits",
						title: "setTitle",
						subtitle: "setSubtitle"
					},
					r = a.chart,
					g, n, A = [];
				x(t, "update", {
					options: a
				});
				if(r) {
					l(!0, t.options.chart, r);
					"className" in r && t.setClassName(r.className);
					"reflow" in r && t.setReflow(r.reflow);
					if("inverted" in r || "polar" in r || "type" in r) t.propFromSeries(), g = !0;
					"alignTicks" in r && (g = !0);
					d(r, function(a, b) {
						-1 !== f("chart." + b, t.propsRequireUpdateSeries) && (n = !0); - 1 !== f(b, t.propsRequireDirtyBox) && (t.isDirtyBox = !0)
					});
					"style" in r && t.renderer.setStyle(r.style)
				}
				a.colors && (this.options.colors = a.colors);
				a.plotOptions &&
					l(!0, this.options.plotOptions, a.plotOptions);
				d(a, function(a, b) {
					if(t[b] && "function" === typeof t[b].update) t[b].update(a, !1);
					else if("function" === typeof t[p[b]]) t[p[b]](a);
					"chart" !== b && -1 !== f(b, t.propsRequireUpdateSeries) && (n = !0)
				});
				u("xAxis yAxis zAxis series colorAxis pane".split(" "), function(b) {
					var c;
					a[b] && ("series" === b && (c = [], u(t[b], function(a, b) {
						a.options.isInternal || c.push(b)
					})), u(L(a[b]), function(a, d) {
						(d = e(a.id) && t.get(a.id) || t[b][c ? c[d] : d]) && d.coll === b && (d.update(a, !1), m && (d.touched = !0));
						if(!d &&
							m)
							if("series" === b) t.addSeries(a, !1).touched = !0;
							else if("xAxis" === b || "yAxis" === b) t.addAxis(a, "xAxis" === b, !1).touched = !0
					}), m && u(t[b], function(a) {
						a.touched || a.options.isInternal ? delete a.touched : A.push(a)
					}))
				});
				u(A, function(a) {
					a.remove(!1)
				});
				g && u(t.axes, function(a) {
					a.update({}, !1)
				});
				n && u(t.series, function(a) {
					a.update({}, !1)
				});
				a.loading && l(!0, t.options.loading, a.loading);
				g = r && r.width;
				r = r && r.height;
				c(g) && g !== t.chartWidth || c(r) && r !== t.chartHeight ? t.setSize(g, r, k) : b(h, !0) && t.redraw(k);
				x(t, "afterUpdate", {
					options: a
				})
			},
			setSubtitle: function(a) {
				this.setTitle(void 0, a)
			}
		});
		q(v.prototype, {
			update: function(a, c, d, f) {
				function e() {
					h.applyOptions(a);
					null === h.y && g && (h.graphic = g.destroy());
					k(a, !0) && (g && g.element && a && a.marker && void 0 !== a.marker.symbol && (h.graphic = g.destroy()), a && a.dataLabels && h.dataLabel && (h.dataLabel = h.dataLabel.destroy()), h.connector && (h.connector = h.connector.destroy()));
					l = h.index;
					m.updateParallelArrays(h, l);
					p.data[l] = k(p.data[l], !0) || k(a, !0) ? h.options : b(a, p.data[l]);
					m.isDirty = m.isDirtyData = !0;
					!m.fixedBox &&
						m.hasCartesianSeries && (t.isDirtyBox = !0);
					"point" === p.legendType && (t.isDirtyLegend = !0);
					c && t.redraw(d)
				}
				var h = this,
					m = h.series,
					g = h.graphic,
					l, t = m.chart,
					p = m.options;
				c = b(c, !0);
				!1 === f ? e() : h.firePointEvent("update", {
					options: a
				}, e)
			},
			remove: function(a, b) {
				this.series.removePoint(f(this, this.series.data), a, b)
			}
		});
		q(p.prototype, {
			addPoint: function(a, c, d, f) {
				var e = this.options,
					h = this.data,
					m = this.chart,
					g = this.xAxis,
					g = g && g.hasNames && g.names,
					l = e.data,
					k, t, p = this.xData,
					r, n;
				c = b(c, !0);
				k = {
					series: this
				};
				this.pointClass.prototype.applyOptions.apply(k, [a]);
				n = k.x;
				r = p.length;
				if(this.requireSorting && n < p[r - 1])
					for(t = !0; r && p[r - 1] > n;) r--;
				this.updateParallelArrays(k, "splice", r, 0, 0);
				this.updateParallelArrays(k, r);
				g && k.name && (g[n] = k.name);
				l.splice(r, 0, a);
				t && (this.data.splice(r, 0, null), this.processData());
				"point" === e.legendType && this.generatePoints();
				d && (h[0] && h[0].remove ? h[0].remove(!1) : (h.shift(), this.updateParallelArrays(k, "shift"), l.shift()));
				this.isDirtyData = this.isDirty = !0;
				c && m.redraw(f)
			},
			removePoint: function(a, c, d) {
				var f = this,
					e = f.data,
					h = e[a],
					m = f.points,
					g = f.chart,
					l = function() {
						m && m.length === e.length && m.splice(a, 1);
						e.splice(a, 1);
						f.options.data.splice(a, 1);
						f.updateParallelArrays(h || {
							series: f
						}, "splice", a, 1);
						h && h.destroy();
						f.isDirty = !0;
						f.isDirtyData = !0;
						c && g.redraw()
					};
				t(d, g);
				c = b(c, !0);
				h ? h.firePointEvent("remove", null, l) : l()
			},
			remove: function(a, c, d) {
				function f() {
					e.destroy();
					h.isDirtyLegend = h.isDirtyBox = !0;
					h.linkSeries();
					b(a, !0) && h.redraw(c)
				}
				var e = this,
					h = e.chart;
				!1 !== d ? x(e, "remove", null, f) : f()
			},
			update: function(c, d) {
				var e = this,
					h = e.chart,
					k = e.userOptions,
					t =
					e.oldType || e.type,
					p = c.type || k.type || h.options.chart.type,
					g = I[t].prototype,
					r, n = ["group", "markerGroup", "dataLabelsGroup"],
					v = ["navigatorSeries", "baseSeries"],
					A = e.finishedAnimating && {
						animation: !1
					},
					y = ["data", "name", "turboThreshold"],
					H = a.keys(c),
					z = 0 < H.length;
				u(H, function(a) {
					-1 === f(a, y) && (z = !1)
				});
				if(z) c.data && this.setData(c.data, !1), c.name && this.setName(c.name, !1);
				else {
					v = n.concat(v);
					u(v, function(a) {
						v[a] = e[a];
						delete e[a]
					});
					c = l(k, A, {
							index: e.index,
							pointStart: b(k.pointStart, e.xData[0])
						}, {
							data: e.options.data
						},
						c);
					e.remove(!1, null, !1);
					for(r in g) e[r] = void 0;
					I[p || t] ? q(e, I[p || t].prototype) : a.error(17, !0);
					u(v, function(a) {
						e[a] = v[a]
					});
					e.init(h, c);
					c.zIndex !== k.zIndex && u(n, function(a) {
						e[a] && e[a].attr({
							zIndex: c.zIndex
						})
					});
					e.oldType = t;
					h.linkSeries()
				}
				x(this, "afterUpdate");
				b(d, !0) && h.redraw(!1)
			},
			setName: function(a) {
				this.name = this.options.name = this.userOptions.name = a;
				this.chart.isDirtyLegend = !0
			}
		});
		q(F.prototype, {
			update: function(a, c) {
				var f = this.chart,
					e = a && a.events || {};
				a = l(this.userOptions, a);
				f.options[this.coll].indexOf &&
					(f.options[this.coll][f.options[this.coll].indexOf(this.userOptions)] = a);
				d(f.options[this.coll].events, function(a, b) {
					"undefined" === typeof e[b] && (e[b] = void 0)
				});
				this.destroy(!0);
				this.init(f, q(a, {
					events: e
				}));
				f.isDirtyBox = !0;
				b(c, !0) && f.redraw()
			},
			remove: function(a) {
				for(var c = this.chart, d = this.coll, f = this.series, e = f.length; e--;) f[e] && f[e].remove(!1);
				y(c.axes, this);
				y(c[d], this);
				r(c.options[d]) ? c.options[d].splice(this.options.index, 1) : delete c.options[d];
				u(c[d], function(a, b) {
					a.options.index = a.userOptions.index =
						b
				});
				this.destroy();
				c.isDirtyBox = !0;
				b(a, !0) && c.redraw()
			},
			setTitle: function(a, b) {
				this.update({
					title: a
				}, b)
			},
			setCategories: function(a, b) {
				this.update({
					categories: a
				}, b)
			}
		})
	})(K);
	(function(a) {
		var C = a.color,
			E = a.each,
			F = a.map,
			n = a.pick,
			h = a.Series,
			e = a.seriesType;
		e("area", "line", {
			softThreshold: !1,
			threshold: 0
		}, {
			singleStacks: !1,
			getStackPoints: function(e) {
				var h = [],
					q = [],
					u = this.xAxis,
					f = this.yAxis,
					c = f.stacks[this.stackKey],
					k = {},
					r = this.index,
					l = f.series,
					d = l.length,
					b, v = n(f.options.reversedStacks, !0) ? 1 : -1,
					p;
				e = e || this.points;
				if(this.options.stacking) {
					for(p = 0; p < e.length; p++) e[p].leftNull = e[p].rightNull = null, k[e[p].x] = e[p];
					a.objectEach(c, function(a, b) {
						null !== a.total && q.push(b)
					});
					q.sort(function(a, b) {
						return a - b
					});
					b = F(l, function() {
						return this.visible
					});
					E(q, function(a, e) {
						var l = 0,
							t, n;
						if(k[a] && !k[a].isNull) h.push(k[a]), E([-1, 1], function(f) {
							var h = 1 === f ? "rightNull" : "leftNull",
								l = 0,
								m = c[q[e + f]];
							if(m)
								for(p = r; 0 <= p && p < d;) t = m.points[p], t || (p === r ? k[a][h] = !0 : b[p] && (n = c[a].points[p]) && (l -= n[1] - n[0])), p += v;
							k[a][1 === f ? "rightCliff" : "leftCliff"] =
								l
						});
						else {
							for(p = r; 0 <= p && p < d;) {
								if(t = c[a].points[p]) {
									l = t[1];
									break
								}
								p += v
							}
							l = f.translate(l, 0, 1, 0, 1);
							h.push({
								isNull: !0,
								plotX: u.translate(a, 0, 0, 0, 1),
								x: a,
								plotY: l,
								yBottom: l
							})
						}
					})
				}
				return h
			},
			getGraphPath: function(a) {
				var e = h.prototype.getGraphPath,
					q = this.options,
					u = q.stacking,
					f = this.yAxis,
					c, k, r = [],
					l = [],
					d = this.index,
					b, v = f.stacks[this.stackKey],
					p = q.threshold,
					I = f.getThreshold(q.threshold),
					t, q = q.connectNulls || "percent" === u,
					L = function(c, e, h) {
						var m = a[c];
						c = u && v[m.x].points[d];
						var k = m[h + "Null"] || 0;
						h = m[h + "Cliff"] || 0;
						var t,
							n, m = !0;
						h || k ? (t = (k ? c[0] : c[1]) + h, n = c[0] + h, m = !!k) : !u && a[e] && a[e].isNull && (t = n = p);
						void 0 !== t && (l.push({
							plotX: b,
							plotY: null === t ? I : f.getThreshold(t),
							isNull: m,
							isCliff: !0
						}), r.push({
							plotX: b,
							plotY: null === n ? I : f.getThreshold(n),
							doCurve: !1
						}))
					};
				a = a || this.points;
				u && (a = this.getStackPoints(a));
				for(c = 0; c < a.length; c++)
					if(k = a[c].isNull, b = n(a[c].rectPlotX, a[c].plotX), t = n(a[c].yBottom, I), !k || q) q || L(c, c - 1, "left"), k && !u && q || (l.push(a[c]), r.push({
						x: c,
						plotX: b,
						plotY: t
					})), q || L(c, c + 1, "right");
				c = e.call(this, l, !0, !0);
				r.reversed = !0;
				k = e.call(this, r, !0, !0);
				k.length && (k[0] = "L");
				k = c.concat(k);
				e = e.call(this, l, !1, q);
				k.xMap = c.xMap;
				this.areaPath = k;
				return e
			},
			drawGraph: function() {
				this.areaPath = [];
				h.prototype.drawGraph.apply(this);
				var a = this,
					e = this.areaPath,
					q = this.options,
					x = [
						["area", "highcharts-area", this.color, q.fillColor]
					];
				E(this.zones, function(f, c) {
					x.push(["zone-area-" + c, "highcharts-area highcharts-zone-area-" + c + " " + f.className, f.color || a.color, f.fillColor || q.fillColor])
				});
				E(x, function(f) {
					var c = f[0],
						h = a[c];
					h ? (h.endX = a.preventGraphAnimation ?
						null : e.xMap, h.animate({
							d: e
						})) : (h = a[c] = a.chart.renderer.path(e).addClass(f[1]).attr({
						fill: n(f[3], C(f[2]).setOpacity(n(q.fillOpacity, .75)).get()),
						zIndex: 0
					}).add(a.group), h.isArea = !0);
					h.startX = e.xMap;
					h.shiftUnit = q.step ? 2 : 1
				})
			},
			drawLegendSymbol: a.LegendSymbolMixin.drawRectangle
		})
	})(K);
	(function(a) {
		var C = a.pick;
		a = a.seriesType;
		a("spline", "line", {}, {
			getPointSpline: function(a, F, n) {
				var h = F.plotX,
					e = F.plotY,
					u = a[n - 1];
				n = a[n + 1];
				var y, q, x, f;
				if(u && !u.isNull && !1 !== u.doCurve && !F.isCliff && n && !n.isNull && !1 !== n.doCurve &&
					!F.isCliff) {
					a = u.plotY;
					x = n.plotX;
					n = n.plotY;
					var c = 0;
					y = (1.5 * h + u.plotX) / 2.5;
					q = (1.5 * e + a) / 2.5;
					x = (1.5 * h + x) / 2.5;
					f = (1.5 * e + n) / 2.5;
					x !== y && (c = (f - q) * (x - h) / (x - y) + e - f);
					q += c;
					f += c;
					q > a && q > e ? (q = Math.max(a, e), f = 2 * e - q) : q < a && q < e && (q = Math.min(a, e), f = 2 * e - q);
					f > n && f > e ? (f = Math.max(n, e), q = 2 * e - f) : f < n && f < e && (f = Math.min(n, e), q = 2 * e - f);
					F.rightContX = x;
					F.rightContY = f
				}
				F = ["C", C(u.rightContX, u.plotX), C(u.rightContY, u.plotY), C(y, h), C(q, e), h, e];
				u.rightContX = u.rightContY = null;
				return F
			}
		})
	})(K);
	(function(a) {
		var C = a.seriesTypes.area.prototype,
			E = a.seriesType;
		E("areaspline", "spline", a.defaultPlotOptions.area, {
			getStackPoints: C.getStackPoints,
			getGraphPath: C.getGraphPath,
			drawGraph: C.drawGraph,
			drawLegendSymbol: a.LegendSymbolMixin.drawRectangle
		})
	})(K);
	(function(a) {
		var C = a.animObject,
			E = a.color,
			F = a.each,
			n = a.extend,
			h = a.isNumber,
			e = a.merge,
			u = a.pick,
			y = a.Series,
			q = a.seriesType,
			x = a.svg;
		q("column", "line", {
			borderRadius: 0,
			crisp: !0,
			groupPadding: .2,
			marker: null,
			pointPadding: .1,
			minPointLength: 0,
			cropThreshold: 50,
			pointRange: null,
			states: {
				hover: {
					halo: !1,
					brightness: .1
				},
				select: {
					color: "#cccccc",
					borderColor: "#000000"
				}
			},
			dataLabels: {
				align: null,
				verticalAlign: null,
				y: null
			},
			softThreshold: !1,
			startFromThreshold: !0,
			stickyTracking: !1,
			tooltip: {
				distance: 6
			},
			threshold: 0,
			borderColor: "#ffffff"
		}, {
			cropShoulder: 0,
			directTouch: !0,
			trackerGroups: ["group", "dataLabelsGroup"],
			negStacks: !0,
			init: function() {
				y.prototype.init.apply(this, arguments);
				var a = this,
					c = a.chart;
				c.hasRendered && F(c.series, function(c) {
					c.type === a.type && (c.isDirty = !0)
				})
			},
			getColumnMetrics: function() {
				var a = this,
					c = a.options,
					e = a.xAxis,
					h = a.yAxis,
					l = e.options.reversedStacks,
					l = e.reversed && !l || !e.reversed && l,
					d, b = {},
					n = 0;
				!1 === c.grouping ? n = 1 : F(a.chart.series, function(c) {
					var f = c.options,
						e = c.yAxis,
						l;
					c.type !== a.type || !c.visible && a.chart.options.chart.ignoreHiddenSeries || h.len !== e.len || h.pos !== e.pos || (f.stacking ? (d = c.stackKey, void 0 === b[d] && (b[d] = n++), l = b[d]) : !1 !== f.grouping && (l = n++), c.columnIndex = l)
				});
				var p = Math.min(Math.abs(e.transA) * (e.ordinalSlope || c.pointRange || e.closestPointRange || e.tickInterval || 1), e.len),
					q = p * c.groupPadding,
					t = (p - 2 *
						q) / (n || 1),
					c = Math.min(c.maxPointWidth || e.len, u(c.pointWidth, t * (1 - 2 * c.pointPadding)));
				a.columnMetrics = {
					width: c,
					offset: (t - c) / 2 + (q + ((a.columnIndex || 0) + (l ? 1 : 0)) * t - p / 2) * (l ? -1 : 1)
				};
				return a.columnMetrics
			},
			crispCol: function(a, c, e, h) {
				var f = this.chart,
					d = this.borderWidth,
					b = -(d % 2 ? .5 : 0),
					d = d % 2 ? .5 : 1;
				f.inverted && f.renderer.isVML && (d += 1);
				this.options.crisp && (e = Math.round(a + e) + b, a = Math.round(a) + b, e -= a);
				h = Math.round(c + h) + d;
				b = .5 >= Math.abs(c) && .5 < h;
				c = Math.round(c) + d;
				h -= c;
				b && h && (--c, h += 1);
				return {
					x: a,
					y: c,
					width: e,
					height: h
				}
			},
			translate: function() {
				var a = this,
					c = a.chart,
					e = a.options,
					h = a.dense = 2 > a.closestPointRange * a.xAxis.transA,
					h = a.borderWidth = u(e.borderWidth, h ? 0 : 1),
					l = a.yAxis,
					d = e.threshold,
					b = a.translatedThreshold = l.getThreshold(d),
					n = u(e.minPointLength, 5),
					p = a.getColumnMetrics(),
					q = p.width,
					t = a.barW = Math.max(q, 1 + 2 * h),
					x = a.pointXOffset = p.offset;
				c.inverted && (b -= .5);
				e.pointPadding && (t = Math.ceil(t));
				y.prototype.translate.apply(a);
				F(a.points, function(f) {
					var e = u(f.yBottom, b),
						h = 999 + Math.abs(e),
						h = Math.min(Math.max(-h, f.plotY), l.len + h),
						k = f.plotX + x,
						p = t,
						r = Math.min(h, e),
						v, g = Math.max(h, e) - r;
					n && Math.abs(g) < n && (g = n, v = !l.reversed && !f.negative || l.reversed && f.negative, f.y === d && a.dataMax <= d && l.min < d && (v = !v), r = Math.abs(r - b) > n ? e - n : b - (v ? n : 0));
					f.barX = k;
					f.pointWidth = q;
					f.tooltipPos = c.inverted ? [l.len + l.pos - c.plotLeft - h, a.xAxis.len - k - p / 2, g] : [k + p / 2, h + l.pos - c.plotTop, g];
					f.shapeType = "rect";
					f.shapeArgs = a.crispCol.apply(a, f.isNull ? [k, b, p, 0] : [k, r, p, g])
				})
			},
			getSymbol: a.noop,
			drawLegendSymbol: a.LegendSymbolMixin.drawRectangle,
			drawGraph: function() {
				this.group[this.dense ?
					"addClass" : "removeClass"]("highcharts-dense-data")
			},
			pointAttribs: function(a, c) {
				var f = this.options,
					h, l = this.pointAttrToOptions || {};
				h = l.stroke || "borderColor";
				var d = l["stroke-width"] || "borderWidth",
					b = a && a.color || this.color,
					n = a && a[h] || f[h] || this.color || b,
					p = a && a[d] || f[d] || this[d] || 0,
					l = f.dashStyle;
				a && this.zones.length && (b = a.getZone(), b = a.options.color || b && b.color || this.color);
				c && (a = e(f.states[c], a.options.states && a.options.states[c] || {}), c = a.brightness, b = a.color || void 0 !== c && E(b).brighten(a.brightness).get() ||
					b, n = a[h] || n, p = a[d] || p, l = a.dashStyle || l);
				h = {
					fill: b,
					stroke: n,
					"stroke-width": p
				};
				l && (h.dashstyle = l);
				return h
			},
			drawPoints: function() {
				var a = this,
					c = this.chart,
					k = a.options,
					r = c.renderer,
					l = k.animationLimit || 250,
					d;
				F(a.points, function(b) {
					var f = b.graphic,
						p = f && c.pointCount < l ? "animate" : "attr";
					if(h(b.plotY) && null !== b.y) {
						d = b.shapeArgs;
						if(f) f[p](e(d));
						else b.graphic = f = r[b.shapeType](d).add(b.group || a.group);
						k.borderRadius && f.attr({
							r: k.borderRadius
						});
						f[p](a.pointAttribs(b, b.selected && "select")).shadow(k.shadow, null,
							k.stacking && !k.borderRadius);
						f.addClass(b.getClassName(), !0)
					} else f && (b.graphic = f.destroy())
				})
			},
			animate: function(a) {
				var c = this,
					f = this.yAxis,
					e = c.options,
					h = this.chart.inverted,
					d = {},
					b = h ? "translateX" : "translateY",
					q;
				x && (a ? (d.scaleY = .001, a = Math.min(f.pos + f.len, Math.max(f.pos, f.toPixels(e.threshold))), h ? d.translateX = a - f.len : d.translateY = a, c.group.attr(d)) : (q = c.group.attr(b), c.group.animate({
					scaleY: 1
				}, n(C(c.options.animation), {
					step: function(a, e) {
						d[b] = q + e.pos * (f.pos - q);
						c.group.attr(d)
					}
				})), c.animate = null))
			},
			remove: function() {
				var a = this,
					c = a.chart;
				c.hasRendered && F(c.series, function(c) {
					c.type === a.type && (c.isDirty = !0)
				});
				y.prototype.remove.apply(a, arguments)
			}
		})
	})(K);
	(function(a) {
		a = a.seriesType;
		a("bar", "column", null, {
			inverted: !0
		})
	})(K);
	(function(a) {
		var C = a.Series;
		a = a.seriesType;
		a("scatter", "line", {
			lineWidth: 0,
			findNearestPointBy: "xy",
			marker: {
				enabled: !0
			},
			tooltip: {
				headerFormat: '\x3cspan style\x3d"color:{point.color}"\x3e\u25cf\x3c/span\x3e \x3cspan style\x3d"font-size: 0.85em"\x3e {series.name}\x3c/span\x3e\x3cbr/\x3e',
				pointFormat: "x: \x3cb\x3e{point.x}\x3c/b\x3e\x3cbr/\x3ey: \x3cb\x3e{point.y}\x3c/b\x3e\x3cbr/\x3e"
			}
		}, {
			sorted: !1,
			requireSorting: !1,
			noSharedTooltip: !0,
			trackerGroups: ["group", "markerGroup", "dataLabelsGroup"],
			takeOrdinalPosition: !1,
			drawGraph: function() {
				this.options.lineWidth && C.prototype.drawGraph.call(this)
			}
		})
	})(K);
	(function(a) {
		var C = a.deg2rad,
			E = a.isNumber,
			F = a.pick,
			n = a.relativeLength;
		a.CenteredSeriesMixin = {
			getCenter: function() {
				var a = this.options,
					e = this.chart,
					u = 2 * (a.slicedOffset || 0),
					y = e.plotWidth - 2 * u,
					e = e.plotHeight - 2 * u,
					q = a.center,
					q = [F(q[0], "50%"), F(q[1], "50%"), a.size || "100%", a.innerSize || 0],
					x = Math.min(y, e),
					f, c;
				for(f = 0; 4 > f; ++f) c = q[f], a = 2 > f || 2 === f && /%$/.test(c), q[f] = n(c, [y, e, x, q[2]][f]) + (a ? u : 0);
				q[3] > q[2] && (q[3] = q[2]);
				return q
			},
			getStartAndEndRadians: function(a, e) {
				a = E(a) ? a : 0;
				e = E(e) && e > a && 360 > e - a ? e : a + 360;
				return {
					start: C * (a + -90),
					end: C * (e + -90)
				}
			}
		}
	})(K);
	(function(a) {
		var C = a.addEvent,
			E = a.CenteredSeriesMixin,
			F = a.defined,
			n = a.each,
			h = a.extend,
			e = E.getStartAndEndRadians,
			u = a.inArray,
			y = a.noop,
			q = a.pick,
			x = a.Point,
			f = a.Series,
			c = a.seriesType,
			k = a.setAnimation;
		c("pie", "line", {
			center: [null, null],
			clip: !1,
			colorByPoint: !0,
			dataLabels: {
				allowOverlap: !0,
				distance: 30,
				enabled: !0,
				formatter: function() {
					return this.point.isNull ? void 0 : this.point.name
				},
				x: 0
			},
			ignoreHiddenPoint: !0,
			legendType: "point",
			marker: null,
			size: null,
			showInLegend: !1,
			slicedOffset: 10,
			stickyTracking: !1,
			tooltip: {
				followPointer: !0
			},
			borderColor: "#ffffff",
			borderWidth: 1,
			states: {
				hover: {
					brightness: .1
				}
			}
		}, {
			isCartesian: !1,
			requireSorting: !1,
			directTouch: !0,
			noSharedTooltip: !0,
			trackerGroups: ["group", "dataLabelsGroup"],
			axisTypes: [],
			pointAttribs: a.seriesTypes.column.prototype.pointAttribs,
			animate: function(a) {
				var c = this,
					d = c.points,
					b = c.startAngleRad;
				a || (n(d, function(a) {
					var d = a.graphic,
						f = a.shapeArgs;
					d && (d.attr({
						r: a.startR || c.center[3] / 2,
						start: b,
						end: b
					}), d.animate({
						r: f.r,
						start: f.start,
						end: f.end
					}, c.options.animation))
				}), c.animate = null)
			},
			updateTotals: function() {
				var a, c = 0,
					d = this.points,
					b = d.length,
					f, e = this.options.ignoreHiddenPoint;
				for(a = 0; a < b; a++) f = d[a], c += e && !f.visible ? 0 : f.isNull ?
					0 : f.y;
				this.total = c;
				for(a = 0; a < b; a++) f = d[a], f.percentage = 0 < c && (f.visible || !e) ? f.y / c * 100 : 0, f.total = c
			},
			generatePoints: function() {
				f.prototype.generatePoints.call(this);
				this.updateTotals()
			},
			translate: function(a) {
				this.generatePoints();
				var c = 0,
					d = this.options,
					b = d.slicedOffset,
					f = b + (d.borderWidth || 0),
					h, k, t, n = e(d.startAngle, d.endAngle),
					r = this.startAngleRad = n.start,
					n = (this.endAngleRad = n.end) - r,
					u = this.points,
					m, x = d.dataLabels.distance,
					d = d.ignoreHiddenPoint,
					y, C = u.length,
					G;
				a || (this.center = a = this.getCenter());
				this.getX =
					function(b, c, d) {
						t = Math.asin(Math.min((b - a[1]) / (a[2] / 2 + d.labelDistance), 1));
						return a[0] + (c ? -1 : 1) * Math.cos(t) * (a[2] / 2 + d.labelDistance)
					};
				for(y = 0; y < C; y++) {
					G = u[y];
					G.labelDistance = q(G.options.dataLabels && G.options.dataLabels.distance, x);
					this.maxLabelDistance = Math.max(this.maxLabelDistance || 0, G.labelDistance);
					h = r + c * n;
					if(!d || G.visible) c += G.percentage / 100;
					k = r + c * n;
					G.shapeType = "arc";
					G.shapeArgs = {
						x: a[0],
						y: a[1],
						r: a[2] / 2,
						innerR: a[3] / 2,
						start: Math.round(1E3 * h) / 1E3,
						end: Math.round(1E3 * k) / 1E3
					};
					t = (k + h) / 2;
					t > 1.5 * Math.PI ?
						t -= 2 * Math.PI : t < -Math.PI / 2 && (t += 2 * Math.PI);
					G.slicedTranslation = {
						translateX: Math.round(Math.cos(t) * b),
						translateY: Math.round(Math.sin(t) * b)
					};
					k = Math.cos(t) * a[2] / 2;
					m = Math.sin(t) * a[2] / 2;
					G.tooltipPos = [a[0] + .7 * k, a[1] + .7 * m];
					G.half = t < -Math.PI / 2 || t > Math.PI / 2 ? 1 : 0;
					G.angle = t;
					h = Math.min(f, G.labelDistance / 5);
					G.labelPos = [a[0] + k + Math.cos(t) * G.labelDistance, a[1] + m + Math.sin(t) * G.labelDistance, a[0] + k + Math.cos(t) * h, a[1] + m + Math.sin(t) * h, a[0] + k, a[1] + m, 0 > G.labelDistance ? "center" : G.half ? "right" : "left", t]
				}
			},
			drawGraph: null,
			drawPoints: function() {
				var a = this,
					c = a.chart.renderer,
					d, b, f, e, k = a.options.shadow;
				k && !a.shadowGroup && (a.shadowGroup = c.g("shadow").add(a.group));
				n(a.points, function(l) {
					b = l.graphic;
					if(l.isNull) b && (l.graphic = b.destroy());
					else {
						e = l.shapeArgs;
						d = l.getTranslate();
						var t = l.shadowGroup;
						k && !t && (t = l.shadowGroup = c.g("shadow").add(a.shadowGroup));
						t && t.attr(d);
						f = a.pointAttribs(l, l.selected && "select");
						b ? b.setRadialReference(a.center).attr(f).animate(h(e, d)) : (l.graphic = b = c[l.shapeType](e).setRadialReference(a.center).attr(d).add(a.group),
							b.attr(f).attr({
								"stroke-linejoin": "round"
							}).shadow(k, t));
						b.attr({
							visibility: l.visible ? "inherit" : "hidden"
						});
						b.addClass(l.getClassName())
					}
				})
			},
			searchPoint: y,
			sortByAngle: function(a, c) {
				a.sort(function(a, b) {
					return void 0 !== a.angle && (b.angle - a.angle) * c
				})
			},
			drawLegendSymbol: a.LegendSymbolMixin.drawRectangle,
			getCenter: E.getCenter,
			getSymbol: y
		}, {
			init: function() {
				x.prototype.init.apply(this, arguments);
				var a = this,
					c;
				a.name = q(a.name, "Slice");
				c = function(c) {
					a.slice("select" === c.type)
				};
				C(a, "select", c);
				C(a, "unselect",
					c);
				return a
			},
			isValid: function() {
				return a.isNumber(this.y, !0) && 0 <= this.y
			},
			setVisible: function(a, c) {
				var d = this,
					b = d.series,
					f = b.chart,
					e = b.options.ignoreHiddenPoint;
				c = q(c, e);
				a !== d.visible && (d.visible = d.options.visible = a = void 0 === a ? !d.visible : a, b.options.data[u(d, b.data)] = d.options, n(["graphic", "dataLabel", "connector", "shadowGroup"], function(b) {
					if(d[b]) d[b][a ? "show" : "hide"](!0)
				}), d.legendItem && f.legend.colorizeItem(d, a), a || "hover" !== d.state || d.setState(""), e && (b.isDirty = !0), c && f.redraw())
			},
			slice: function(a,
				c, d) {
				var b = this.series;
				k(d, b.chart);
				q(c, !0);
				this.sliced = this.options.sliced = F(a) ? a : !this.sliced;
				b.options.data[u(this, b.data)] = this.options;
				this.graphic.animate(this.getTranslate());
				this.shadowGroup && this.shadowGroup.animate(this.getTranslate())
			},
			getTranslate: function() {
				return this.sliced ? this.slicedTranslation : {
					translateX: 0,
					translateY: 0
				}
			},
			haloPath: function(a) {
				var c = this.shapeArgs;
				return this.sliced || !this.visible ? [] : this.series.chart.renderer.symbols.arc(c.x, c.y, c.r + a, c.r + a, {
					innerR: this.shapeArgs.r -
						1,
					start: c.start,
					end: c.end
				})
			}
		})
	})(K);
	(function(a) {
		var C = a.addEvent,
			E = a.arrayMax,
			F = a.defined,
			n = a.each,
			h = a.extend,
			e = a.format,
			u = a.map,
			y = a.merge,
			q = a.noop,
			x = a.pick,
			f = a.relativeLength,
			c = a.Series,
			k = a.seriesTypes,
			r = a.some,
			l = a.stableSort;
		a.distribute = function(c, b, f) {
			function d(a, b) {
				return a.target - b.target
			}
			var e, h = !0,
				k = c,
				q = [],
				v;
			v = 0;
			var m = k.reducedLen || b;
			for(e = c.length; e--;) v += c[e].size;
			if(v > m) {
				l(c, function(a, b) {
					return(b.rank || 0) - (a.rank || 0)
				});
				for(v = e = 0; v <= m;) v += c[e].size, e++;
				q = c.splice(e - 1, c.length)
			}
			l(c, d);
			for(c = u(c, function(a) {
					return {
						size: a.size,
						targets: [a.target],
						align: x(a.align, .5)
					}
				}); h;) {
				for(e = c.length; e--;) h = c[e], v = (Math.min.apply(0, h.targets) + Math.max.apply(0, h.targets)) / 2, h.pos = Math.min(Math.max(0, v - h.size * h.align), b - h.size);
				e = c.length;
				for(h = !1; e--;) 0 < e && c[e - 1].pos + c[e - 1].size > c[e].pos && (c[e - 1].size += c[e].size, c[e - 1].targets = c[e - 1].targets.concat(c[e].targets), c[e - 1].align = .5, c[e - 1].pos + c[e - 1].size > b && (c[e - 1].pos = b - c[e - 1].size), c.splice(e, 1), h = !0)
			}
			k.push.apply(k, q);
			e = 0;
			r(c, function(c) {
				var d =
					0;
				if(r(c.targets, function() {
						k[e].pos = c.pos + d;
						if(Math.abs(k[e].pos - k[e].target) > f) return n(k.slice(0, e + 1), function(a) {
							delete a.pos
						}), k.reducedLen = (k.reducedLen || b) - .1 * b, k.reducedLen > .1 * b && a.distribute(k, b, f), !0;
						d += k[e].size;
						e++
					})) return !0
			});
			l(k, d)
		};
		c.prototype.drawDataLabels = function() {
			function c(a, b) {
				var c = b.filter;
				return c ? (b = c.operator, a = a[c.property], c = c.value, "\x3e" === b && a > c || "\x3c" === b && a < c || "\x3e\x3d" === b && a >= c || "\x3c\x3d" === b && a <= c || "\x3d\x3d" === b && a == c || "\x3d\x3d\x3d" === b && a === c ? !0 : !1) : !0
			}
			var b = this,
				f = b.chart,
				h = b.options,
				l = h.dataLabels,
				k = b.points,
				r, q, u = b.hasRendered || 0,
				m, D, B = x(l.defer, !!h.animation),
				E = f.renderer;
			if(l.enabled || b._hasPointLabels) b.dlProcessOptions && b.dlProcessOptions(l), D = b.plotGroup("dataLabelsGroup", "data-labels", B && !u ? "hidden" : "visible", l.zIndex || 6), B && (D.attr({
				opacity: +u
			}), u || C(b, "afterAnimate", function() {
				b.visible && D.show(!0);
				D[h.animation ? "animate" : "attr"]({
					opacity: 1
				}, {
					duration: 200
				})
			})), q = l, n(k, function(d) {
				var g, k = d.dataLabel,
					t, p, n = d.connector,
					u = !k,
					v;
				r = d.dlOptions ||
					d.options && d.options.dataLabels;
				(g = x(r && r.enabled, q.enabled) && !d.isNull) && (g = !0 === c(d, r || l));
				g && (l = y(q, r), t = d.getLabelConfig(), v = l[d.formatPrefix + "Format"] || l.format, m = F(v) ? e(v, t, f.time) : (l[d.formatPrefix + "Formatter"] || l.formatter).call(t, l), v = l.style, t = l.rotation, v.color = x(l.color, v.color, b.color, "#000000"), "contrast" === v.color && (d.contrastColor = E.getContrast(d.color || b.color), v.color = l.inside || 0 > x(d.labelDistance, l.distance) || h.stacking ? d.contrastColor : "#000000"), h.cursor && (v.cursor = h.cursor), p = {
					fill: l.backgroundColor,
					stroke: l.borderColor,
					"stroke-width": l.borderWidth,
					r: l.borderRadius || 0,
					rotation: t,
					padding: l.padding,
					zIndex: 1
				}, a.objectEach(p, function(a, b) {
					void 0 === a && delete p[b]
				}));
				!k || g && F(m) ? g && F(m) && (k ? p.text = m : (k = d.dataLabel = t ? E.text(m, 0, -9999).addClass("highcharts-data-label") : E.label(m, 0, -9999, l.shape, null, null, l.useHTML, null, "data-label"), k.addClass(" highcharts-data-label-color-" + d.colorIndex + " " + (l.className || "") + (l.useHTML ? " highcharts-tracker" : ""))), k.attr(p), k.css(v).shadow(l.shadow),
					k.added || k.add(D), b.alignDataLabel(d, k, l, null, u)) : (d.dataLabel = k = k.destroy(), n && (d.connector = n.destroy()))
			});
			a.fireEvent(this, "afterDrawDataLabels")
		};
		c.prototype.alignDataLabel = function(a, b, c, e, f) {
			var d = this.chart,
				l = d.inverted,
				k = x(a.dlBox && a.dlBox.centerX, a.plotX, -9999),
				n = x(a.plotY, -9999),
				m = b.getBBox(),
				p, r = c.rotation,
				q = c.align,
				u = this.visible && (a.series.forceDL || d.isInsidePlot(k, Math.round(n), l) || e && d.isInsidePlot(k, l ? e.x + 1 : e.y + e.height - 1, l)),
				g = "justify" === x(c.overflow, "justify");
			if(u && (p = c.style.fontSize,
					p = d.renderer.fontMetrics(p, b).b, e = h({
						x: l ? this.yAxis.len - n : k,
						y: Math.round(l ? this.xAxis.len - k : n),
						width: 0,
						height: 0
					}, e), h(c, {
						width: m.width,
						height: m.height
					}), r ? (g = !1, k = d.renderer.rotCorr(p, r), k = {
						x: e.x + c.x + e.width / 2 + k.x,
						y: e.y + c.y + {
							top: 0,
							middle: .5,
							bottom: 1
						}[c.verticalAlign] * e.height
					}, b[f ? "attr" : "animate"](k).attr({
						align: q
					}), n = (r + 720) % 360, n = 180 < n && 360 > n, "left" === q ? k.y -= n ? m.height : 0 : "center" === q ? (k.x -= m.width / 2, k.y -= m.height / 2) : "right" === q && (k.x -= m.width, k.y -= n ? 0 : m.height), b.placed = !0, b.alignAttr = k) : (b.align(c,
						null, e), k = b.alignAttr), g ? a.isLabelJustified = this.justifyDataLabel(b, c, k, m, e, f) : x(c.crop, !0) && (u = d.isInsidePlot(k.x, k.y) && d.isInsidePlot(k.x + m.width, k.y + m.height)), c.shape && !r)) b[f ? "attr" : "animate"]({
				anchorX: l ? d.plotWidth - a.plotY : a.plotX,
				anchorY: l ? d.plotHeight - a.plotX : a.plotY
			});
			u || (b.attr({
				y: -9999
			}), b.placed = !1)
		};
		c.prototype.justifyDataLabel = function(a, b, c, e, f, h) {
			var d = this.chart,
				l = b.align,
				k = b.verticalAlign,
				m, t, n = a.box ? 0 : a.padding || 0;
			m = c.x + n;
			0 > m && ("right" === l ? b.align = "left" : b.x = -m, t = !0);
			m = c.x + e.width -
				n;
			m > d.plotWidth && ("left" === l ? b.align = "right" : b.x = d.plotWidth - m, t = !0);
			m = c.y + n;
			0 > m && ("bottom" === k ? b.verticalAlign = "top" : b.y = -m, t = !0);
			m = c.y + e.height - n;
			m > d.plotHeight && ("top" === k ? b.verticalAlign = "bottom" : b.y = d.plotHeight - m, t = !0);
			t && (a.placed = !h, a.align(b, null, f));
			return t
		};
		k.pie && (k.pie.prototype.drawDataLabels = function() {
			var d = this,
				b = d.data,
				e, f = d.chart,
				h = d.options.dataLabels,
				l = x(h.connectorPadding, 10),
				k = x(h.connectorWidth, 1),
				r = f.plotWidth,
				q = f.plotHeight,
				m = Math.round(f.chartWidth / 3),
				u, y = d.center,
				C = y[2] /
				2,
				G = y[1],
				g, w, K, Q, J = [
					[],
					[]
				],
				O, N, z, R, S = [0, 0, 0, 0];
			d.visible && (h.enabled || d._hasPointLabels) && (n(b, function(a) {
				a.dataLabel && a.visible && a.dataLabel.shortened && (a.dataLabel.attr({
					width: "auto"
				}).css({
					width: "auto",
					textOverflow: "clip"
				}), a.dataLabel.shortened = !1)
			}), c.prototype.drawDataLabels.apply(d), n(b, function(a) {
				a.dataLabel && (a.visible ? (J[a.half].push(a), a.dataLabel._pos = null, !F(h.style.width) && !F(a.options.dataLabels && a.options.dataLabels.style && a.options.dataLabels.style.width) && a.dataLabel.getBBox().width >
					m && (a.dataLabel.css({
						width: .7 * m
					}), a.dataLabel.shortened = !0)) : a.dataLabel = a.dataLabel.destroy())
			}), n(J, function(b, c) {
				var k, m, t = b.length,
					p = [],
					u;
				if(t)
					for(d.sortByAngle(b, c - .5), 0 < d.maxLabelDistance && (k = Math.max(0, G - C - d.maxLabelDistance), m = Math.min(G + C + d.maxLabelDistance, f.plotHeight), n(b, function(a) {
							0 < a.labelDistance && a.dataLabel && (a.top = Math.max(0, G - C - a.labelDistance), a.bottom = Math.min(G + C + a.labelDistance, f.plotHeight), u = a.dataLabel.getBBox().height || 21, a.distributeBox = {
								target: a.labelPos[1] - a.top + u /
									2,
								size: u,
								rank: a.y
							}, p.push(a.distributeBox))
						}), k = m + u - k, a.distribute(p, k, k / 5)), R = 0; R < t; R++) e = b[R], K = e.labelPos, g = e.dataLabel, z = !1 === e.visible ? "hidden" : "inherit", N = k = K[1], p && F(e.distributeBox) && (void 0 === e.distributeBox.pos ? z = "hidden" : (Q = e.distributeBox.size, N = e.top + e.distributeBox.pos)), delete e.positionIndex, O = h.justify ? y[0] + (c ? -1 : 1) * (C + e.labelDistance) : d.getX(N < e.top + 2 || N > e.bottom - 2 ? k : N, c, e), g._attr = {
						visibility: z,
						align: K[6]
					}, g._pos = {
						x: O + h.x + ({
							left: l,
							right: -l
						}[K[6]] || 0),
						y: N + h.y - 10
					}, K.x = O, K.y = N, x(h.crop, !0) && (w = g.getBBox().width, k = null, O - w < l && 1 === c ? (k = Math.round(w - O + l), S[3] = Math.max(k, S[3])) : O + w > r - l && 0 === c && (k = Math.round(O + w - r + l), S[1] = Math.max(k, S[1])), 0 > N - Q / 2 ? S[0] = Math.max(Math.round(-N + Q / 2), S[0]) : N + Q / 2 > q && (S[2] = Math.max(Math.round(N + Q / 2 - q), S[2])), g.sideOverflow = k)
			}), 0 === E(S) || this.verifyDataLabelOverflow(S)) && (this.placeDataLabels(), k && n(this.points, function(a) {
				var b;
				u = a.connector;
				if((g = a.dataLabel) && g._pos && a.visible && 0 < a.labelDistance) {
					z = g._attr.visibility;
					if(b = !u) a.connector = u = f.renderer.path().addClass("highcharts-data-label-connector  highcharts-color-" +
						a.colorIndex + (a.className ? " " + a.className : "")).add(d.dataLabelsGroup), u.attr({
						"stroke-width": k,
						stroke: h.connectorColor || a.color || "#666666"
					});
					u[b ? "attr" : "animate"]({
						d: d.connectorPath(a.labelPos)
					});
					u.attr("visibility", z)
				} else u && (a.connector = u.destroy())
			}))
		}, k.pie.prototype.connectorPath = function(a) {
			var b = a.x,
				c = a.y;
			return x(this.options.dataLabels.softConnector, !0) ? ["M", b + ("left" === a[6] ? 5 : -5), c, "C", b, c, 2 * a[2] - a[4], 2 * a[3] - a[5], a[2], a[3], "L", a[4], a[5]] : ["M", b + ("left" === a[6] ? 5 : -5), c, "L", a[2], a[3], "L",
				a[4], a[5]
			]
		}, k.pie.prototype.placeDataLabels = function() {
			n(this.points, function(a) {
				var b = a.dataLabel;
				b && a.visible && ((a = b._pos) ? (b.sideOverflow && (b._attr.width = b.getBBox().width - b.sideOverflow, b.css({
					width: b._attr.width + "px",
					textOverflow: this.options.dataLabels.style.textOverflow || "ellipsis"
				}), b.shortened = !0), b.attr(b._attr), b[b.moved ? "animate" : "attr"](a), b.moved = !0) : b && b.attr({
					y: -9999
				}))
			}, this)
		}, k.pie.prototype.alignDataLabel = q, k.pie.prototype.verifyDataLabelOverflow = function(a) {
			var b = this.center,
				c =
				this.options,
				d = c.center,
				e = c.minSize || 80,
				h, l = null !== c.size;
			l || (null !== d[0] ? h = Math.max(b[2] - Math.max(a[1], a[3]), e) : (h = Math.max(b[2] - a[1] - a[3], e), b[0] += (a[3] - a[1]) / 2), null !== d[1] ? h = Math.max(Math.min(h, b[2] - Math.max(a[0], a[2])), e) : (h = Math.max(Math.min(h, b[2] - a[0] - a[2]), e), b[1] += (a[0] - a[2]) / 2), h < b[2] ? (b[2] = h, b[3] = Math.min(f(c.innerSize || 0, h), h), this.translate(b), this.drawDataLabels && this.drawDataLabels()) : l = !0);
			return l
		});
		k.column && (k.column.prototype.alignDataLabel = function(a, b, e, f, h) {
			var d = this.chart.inverted,
				l = a.series,
				k = a.dlBox || a.shapeArgs,
				n = x(a.below, a.plotY > x(this.translatedThreshold, l.yAxis.len)),
				m = x(e.inside, !!this.options.stacking);
			k && (f = y(k), 0 > f.y && (f.height += f.y, f.y = 0), k = f.y + f.height - l.yAxis.len, 0 < k && (f.height -= k), d && (f = {
				x: l.yAxis.len - f.y - f.height,
				y: l.xAxis.len - f.x - f.width,
				width: f.height,
				height: f.width
			}), m || (d ? (f.x += n ? 0 : f.width, f.width = 0) : (f.y += n ? f.height : 0, f.height = 0)));
			e.align = x(e.align, !d || m ? "center" : n ? "right" : "left");
			e.verticalAlign = x(e.verticalAlign, d || m ? "middle" : n ? "top" : "bottom");
			c.prototype.alignDataLabel.call(this,
				a, b, e, f, h);
			a.isLabelJustified && a.contrastColor && a.dataLabel.css({
				color: a.contrastColor
			})
		})
	})(K);
	(function(a) {
		var C = a.Chart,
			E = a.each,
			F = a.objectEach,
			n = a.pick;
		a = a.addEvent;
		a(C, "render", function() {
			var a = [];
			E(this.labelCollectors || [], function(e) {
				a = a.concat(e())
			});
			E(this.yAxis || [], function(e) {
				e.options.stackLabels && !e.options.stackLabels.allowOverlap && F(e.stacks, function(e) {
					F(e, function(e) {
						a.push(e.label)
					})
				})
			});
			E(this.series || [], function(e) {
				var h = e.options.dataLabels,
					y = e.dataLabelCollections || ["dataLabel"];
				(h.enabled || e._hasPointLabels) && !h.allowOverlap && e.visible && E(y, function(h) {
					E(e.points, function(e) {
						e[h] && (e[h].labelrank = n(e.labelrank, e.shapeArgs && e.shapeArgs.height), a.push(e[h]))
					})
				})
			});
			this.hideOverlappingLabels(a)
		});
		C.prototype.hideOverlappingLabels = function(a) {
			var e = a.length,
				h, n, q, x, f, c, k = function(a, c, d, b, e, f, h, k) {
					return !(e > a + d || e + h < a || f > c + b || f + k < c)
				};
			q = function(a) {
				var c, d, b, e = 2 * (a.box ? 0 : a.padding || 0);
				if(a && (!a.alignAttr || a.placed)) return c = a.alignAttr || {
						x: a.attr("x"),
						y: a.attr("y")
					}, d = a.parentGroup,
					a.width || (b = a.getBBox(), a.width = b.width, a.height = b.height), {
						x: c.x + (d.translateX || 0),
						y: c.y + (d.translateY || 0),
						width: a.width - e,
						height: a.height - e
					}
			};
			for(n = 0; n < e; n++)
				if(h = a[n]) h.oldOpacity = h.opacity, h.newOpacity = 1, h.absoluteBox = q(h);
			a.sort(function(a, c) {
				return(c.labelrank || 0) - (a.labelrank || 0)
			});
			for(n = 0; n < e; n++)
				for(c = (q = a[n]) && q.absoluteBox, h = n + 1; h < e; ++h)
					if(f = (x = a[h]) && x.absoluteBox, c && f && q !== x && 0 !== q.newOpacity && 0 !== x.newOpacity && (f = k(c.x, c.y, c.width, c.height, f.x, f.y, f.width, f.height)))(q.labelrank < x.labelrank ?
						q : x).newOpacity = 0;
			E(a, function(a) {
				var c, d;
				a && (d = a.newOpacity, a.oldOpacity !== d && (a.alignAttr && a.placed ? (d ? a.show(!0) : c = function() {
					a.hide()
				}, a.alignAttr.opacity = d, a[a.isOld ? "animate" : "attr"](a.alignAttr, null, c)) : a.attr({
					opacity: d
				})), a.isOld = !0)
			})
		}
	})(K);
	(function(a) {
		var C = a.addEvent,
			E = a.Chart,
			F = a.createElement,
			n = a.css,
			h = a.defaultOptions,
			e = a.defaultPlotOptions,
			u = a.each,
			y = a.extend,
			q = a.fireEvent,
			x = a.hasTouch,
			f = a.inArray,
			c = a.isObject,
			k = a.Legend,
			r = a.merge,
			l = a.pick,
			d = a.Point,
			b = a.Series,
			v = a.seriesTypes,
			p = a.svg,
			I;
		I = a.TrackerMixin = {
			drawTrackerPoint: function() {
				var a = this,
					b = a.chart.pointer,
					c = function(a) {
						var c = b.getPointFromEvent(a);
						void 0 !== c && (b.isDirectTouch = !0, c.onMouseOver(a))
					};
				u(a.points, function(a) {
					a.graphic && (a.graphic.element.point = a);
					a.dataLabel && (a.dataLabel.div ? a.dataLabel.div.point = a : a.dataLabel.element.point = a)
				});
				a._hasTracking || (u(a.trackerGroups, function(d) {
					if(a[d]) {
						a[d].addClass("highcharts-tracker").on("mouseover", c).on("mouseout", function(a) {
							b.onTrackerMouseOut(a)
						});
						if(x) a[d].on("touchstart",
							c);
						a.options.cursor && a[d].css(n).css({
							cursor: a.options.cursor
						})
					}
				}), a._hasTracking = !0);
				q(this, "afterDrawTracker")
			},
			drawTrackerGraph: function() {
				var a = this,
					b = a.options,
					c = b.trackByArea,
					d = [].concat(c ? a.areaPath : a.graphPath),
					e = d.length,
					f = a.chart,
					h = f.pointer,
					l = f.renderer,
					k = f.options.tooltip.snap,
					g = a.tracker,
					n, r = function() {
						if(f.hoverSeries !== a) a.onMouseOver()
					},
					v = "rgba(192,192,192," + (p ? .0001 : .002) + ")";
				if(e && !c)
					for(n = e + 1; n--;) "M" === d[n] && d.splice(n + 1, 0, d[n + 1] - k, d[n + 2], "L"), (n && "M" === d[n] || n === e) && d.splice(n,
						0, "L", d[n - 2] + k, d[n - 1]);
				g ? g.attr({
					d: d
				}) : a.graph && (a.tracker = l.path(d).attr({
					"stroke-linejoin": "round",
					visibility: a.visible ? "visible" : "hidden",
					stroke: v,
					fill: c ? v : "none",
					"stroke-width": a.graph.strokeWidth() + (c ? 0 : 2 * k),
					zIndex: 2
				}).add(a.group), u([a.tracker, a.markerGroup], function(a) {
					a.addClass("highcharts-tracker").on("mouseover", r).on("mouseout", function(a) {
						h.onTrackerMouseOut(a)
					});
					b.cursor && a.css({
						cursor: b.cursor
					});
					if(x) a.on("touchstart", r)
				}));
				q(this, "afterDrawTracker")
			}
		};
		v.column && (v.column.prototype.drawTracker =
			I.drawTrackerPoint);
		v.pie && (v.pie.prototype.drawTracker = I.drawTrackerPoint);
		v.scatter && (v.scatter.prototype.drawTracker = I.drawTrackerPoint);
		y(k.prototype, {
			setItemEvents: function(a, b, c) {
				var e = this,
					f = e.chart.renderer.boxWrapper,
					h = "highcharts-legend-" + (a instanceof d ? "point" : "series") + "-active";
				(c ? b : a.legendGroup).on("mouseover", function() {
					a.setState("hover");
					f.addClass(h);
					b.css(e.options.itemHoverStyle)
				}).on("mouseout", function() {
					b.css(r(a.visible ? e.itemStyle : e.itemHiddenStyle));
					f.removeClass(h);
					a.setState()
				}).on("click",
					function(b) {
						var c = function() {
							a.setVisible && a.setVisible()
						};
						f.removeClass(h);
						b = {
							browserEvent: b
						};
						a.firePointEvent ? a.firePointEvent("legendItemClick", b, c) : q(a, "legendItemClick", b, c)
					})
			},
			createCheckboxForItem: function(a) {
				a.checkbox = F("input", {
					type: "checkbox",
					checked: a.selected,
					defaultChecked: a.selected
				}, this.options.itemCheckboxStyle, this.chart.container);
				C(a.checkbox, "click", function(b) {
					q(a.series || a, "checkboxClick", {
						checked: b.target.checked,
						item: a
					}, function() {
						a.select()
					})
				})
			}
		});
		h.legend.itemStyle.cursor =
			"pointer";
		y(E.prototype, {
			showResetZoom: function() {
				function a() {
					b.zoomOut()
				}
				var b = this,
					c = h.lang,
					d = b.options.chart.resetZoomButton,
					e = d.theme,
					f = e.states,
					k = "chart" === d.relativeTo ? null : "plotBox";
				q(this, "beforeShowResetZoom", null, function() {
					b.resetZoomButton = b.renderer.button(c.resetZoom, null, null, a, e, f && f.hover).attr({
						align: d.position.align,
						title: c.resetZoomTitle
					}).addClass("highcharts-reset-zoom").add().align(d.position, !1, k)
				})
			},
			zoomOut: function() {
				q(this, "selection", {
					resetSelection: !0
				}, this.zoom)
			},
			zoom: function(a) {
				var b,
					d = this.pointer,
					e = !1,
					f;
				!a || a.resetSelection ? (u(this.axes, function(a) {
					b = a.zoom()
				}), d.initiated = !1) : u(a.xAxis.concat(a.yAxis), function(a) {
					var c = a.axis;
					d[c.isXAxis ? "zoomX" : "zoomY"] && (b = c.zoom(a.min, a.max), c.displayBtn && (e = !0))
				});
				f = this.resetZoomButton;
				e && !f ? this.showResetZoom() : !e && c(f) && (this.resetZoomButton = f.destroy());
				b && this.redraw(l(this.options.chart.animation, a && a.animation, 100 > this.pointCount))
			},
			pan: function(a, b) {
				var c = this,
					d = c.hoverPoints,
					e;
				d && u(d, function(a) {
					a.setState()
				});
				u("xy" === b ? [1, 0] : [1], function(b) {
					b = c[b ? "xAxis" : "yAxis"][0];
					var d = b.horiz,
						f = a[d ? "chartX" : "chartY"],
						d = d ? "mouseDownX" : "mouseDownY",
						h = c[d],
						g = (b.pointRange || 0) / 2,
						k = b.reversed && !c.inverted || !b.reversed && c.inverted ? -1 : 1,
						l = b.getExtremes(),
						m = b.toValue(h - f, !0) + g * k,
						k = b.toValue(h + b.len - f, !0) - g * k,
						n = k < m,
						h = n ? k : m,
						m = n ? m : k,
						k = Math.min(l.dataMin, g ? l.min : b.toValue(b.toPixels(l.min) - b.minPixelPadding)),
						g = Math.max(l.dataMax, g ? l.max : b.toValue(b.toPixels(l.max) + b.minPixelPadding)),
						n = k - h;
					0 < n && (m += n, h = k);
					n = m - g;
					0 < n && (m = g, h -= n);
					b.series.length &&
						h !== l.min && m !== l.max && (b.setExtremes(h, m, !1, !1, {
							trigger: "pan"
						}), e = !0);
					c[d] = f
				});
				e && c.redraw(!1);
				n(c.container, {
					cursor: "move"
				})
			}
		});
		y(d.prototype, {
			select: function(a, b) {
				var c = this,
					d = c.series,
					e = d.chart;
				a = l(a, !c.selected);
				c.firePointEvent(a ? "select" : "unselect", {
					accumulate: b
				}, function() {
					c.selected = c.options.selected = a;
					d.options.data[f(c, d.data)] = c.options;
					c.setState(a && "select");
					b || u(e.getSelectedPoints(), function(a) {
						a.selected && a !== c && (a.selected = a.options.selected = !1, d.options.data[f(a, d.data)] = a.options,
							a.setState(""), a.firePointEvent("unselect"))
					})
				})
			},
			onMouseOver: function(a) {
				var b = this.series.chart,
					c = b.pointer;
				a = a ? c.normalize(a) : c.getChartCoordinatesFromPoint(this, b.inverted);
				c.runPointActions(a, this)
			},
			onMouseOut: function() {
				var a = this.series.chart;
				this.firePointEvent("mouseOut");
				u(a.hoverPoints || [], function(a) {
					a.setState()
				});
				a.hoverPoints = a.hoverPoint = null
			},
			importEvents: function() {
				if(!this.hasImportedEvents) {
					var b = this,
						c = r(b.series.options.point, b.options).events;
					b.events = c;
					a.objectEach(c, function(a,
						c) {
						C(b, c, a)
					});
					this.hasImportedEvents = !0
				}
			},
			setState: function(a, b) {
				var c = Math.floor(this.plotX),
					d = this.plotY,
					f = this.series,
					h = f.options.states[a || "normal"] || {},
					k = e[f.type].marker && f.options.marker,
					n = k && !1 === k.enabled,
					p = k && k.states && k.states[a || "normal"] || {},
					g = !1 === p.enabled,
					t = f.stateMarkerGraphic,
					r = this.marker || {},
					u = f.chart,
					v = f.halo,
					x, C = k && f.markerAttribs;
				a = a || "";
				if(!(a === this.state && !b || this.selected && "select" !== a || !1 === h.enabled || a && (g || n && !1 === p.enabled) || a && r.states && r.states[a] && !1 === r.states[a].enabled)) {
					C &&
						(x = f.markerAttribs(this, a));
					if(this.graphic) this.state && this.graphic.removeClass("highcharts-point-" + this.state), a && this.graphic.addClass("highcharts-point-" + a), this.graphic.animate(f.pointAttribs(this, a), l(u.options.chart.animation, h.animation)), x && this.graphic.animate(x, l(u.options.chart.animation, p.animation, k.animation)), t && t.hide();
					else {
						if(a && p) {
							k = r.symbol || f.symbol;
							t && t.currentSymbol !== k && (t = t.destroy());
							if(t) t[b ? "animate" : "attr"]({
								x: x.x,
								y: x.y
							});
							else k && (f.stateMarkerGraphic = t = u.renderer.symbol(k,
								x.x, x.y, x.width, x.height).add(f.markerGroup), t.currentSymbol = k);
							t && t.attr(f.pointAttribs(this, a))
						}
						t && (t[a && u.isInsidePlot(c, d, u.inverted) ? "show" : "hide"](), t.element.point = this)
					}(c = h.halo) && c.size ? (v || (f.halo = v = u.renderer.path().add((this.graphic || t).parentGroup)), v.show()[b ? "animate" : "attr"]({
						d: this.haloPath(c.size)
					}), v.attr({
						"class": "highcharts-halo highcharts-color-" + l(this.colorIndex, f.colorIndex) + (this.className ? " " + this.className : ""),
						zIndex: -1
					}), v.point = this, v.attr(y({
						fill: this.color || f.color,
						"fill-opacity": c.opacity
					}, c.attributes))) : v && v.point && v.point.haloPath && v.animate({
						d: v.point.haloPath(0)
					}, null, v.hide);
					this.state = a;
					q(this, "afterSetState")
				}
			},
			haloPath: function(a) {
				return this.series.chart.renderer.symbols.circle(Math.floor(this.plotX) - a, this.plotY - a, 2 * a, 2 * a)
			}
		});
		y(b.prototype, {
			onMouseOver: function() {
				var a = this.chart,
					b = a.hoverSeries;
				if(b && b !== this) b.onMouseOut();
				this.options.events.mouseOver && q(this, "mouseOver");
				this.setState("hover");
				a.hoverSeries = this
			},
			onMouseOut: function() {
				var a =
					this.options,
					b = this.chart,
					c = b.tooltip,
					d = b.hoverPoint;
				b.hoverSeries = null;
				if(d) d.onMouseOut();
				this && a.events.mouseOut && q(this, "mouseOut");
				!c || this.stickyTracking || c.shared && !this.noSharedTooltip || c.hide();
				this.setState()
			},
			setState: function(a) {
				var b = this,
					c = b.options,
					d = b.graph,
					e = c.states,
					f = c.lineWidth,
					c = 0;
				a = a || "";
				if(b.state !== a && (u([b.group, b.markerGroup, b.dataLabelsGroup], function(c) {
							c && (b.state && c.removeClass("highcharts-series-" + b.state), a && c.addClass("highcharts-series-" + a))
						}), b.state = a, !e[a] || !1 !==
						e[a].enabled) && (a && (f = e[a].lineWidth || f + (e[a].lineWidthPlus || 0)), d && !d.dashstyle))
					for(f = {
							"stroke-width": f
						}, d.animate(f, l(e[a || "normal"] && e[a || "normal"].animation, b.chart.options.chart.animation)); b["zone-graph-" + c];) b["zone-graph-" + c].attr(f), c += 1
			},
			setVisible: function(a, b) {
				var c = this,
					d = c.chart,
					e = c.legendItem,
					f, h = d.options.chart.ignoreHiddenSeries,
					k = c.visible;
				f = (c.visible = a = c.options.visible = c.userOptions.visible = void 0 === a ? !k : a) ? "show" : "hide";
				u(["group", "dataLabelsGroup", "markerGroup", "tracker", "tt"],
					function(a) {
						if(c[a]) c[a][f]()
					});
				if(d.hoverSeries === c || (d.hoverPoint && d.hoverPoint.series) === c) c.onMouseOut();
				e && d.legend.colorizeItem(c, a);
				c.isDirty = !0;
				c.options.stacking && u(d.series, function(a) {
					a.options.stacking && a.visible && (a.isDirty = !0)
				});
				u(c.linkedSeries, function(b) {
					b.setVisible(a, !1)
				});
				h && (d.isDirtyBox = !0);
				q(c, f);
				!1 !== b && d.redraw()
			},
			show: function() {
				this.setVisible(!0)
			},
			hide: function() {
				this.setVisible(!1)
			},
			select: function(a) {
				this.selected = a = void 0 === a ? !this.selected : a;
				this.checkbox && (this.checkbox.checked =
					a);
				q(this, a ? "select" : "unselect")
			},
			drawTracker: I.drawTrackerGraph
		})
	})(K);
	(function(a) {
		var C = a.Chart,
			E = a.each,
			F = a.inArray,
			n = a.isArray,
			h = a.isObject,
			e = a.pick,
			u = a.splat;
		C.prototype.setResponsive = function(e) {
			var h = this.options.responsive,
				n = [],
				f = this.currentResponsive;
			h && h.rules && E(h.rules, function(c) {
				void 0 === c._id && (c._id = a.uniqueKey());
				this.matchResponsiveRule(c, n, e)
			}, this);
			var c = a.merge.apply(0, a.map(n, function(c) {
					return a.find(h.rules, function(a) {
						return a._id === c
					}).chartOptions
				})),
				n = n.toString() || void 0;
			n !== (f && f.ruleIds) && (f && this.update(f.undoOptions, e), n ? (this.currentResponsive = {
				ruleIds: n,
				mergedOptions: c,
				undoOptions: this.currentOptions(c)
			}, this.update(c, e)) : this.currentResponsive = void 0)
		};
		C.prototype.matchResponsiveRule = function(a, h) {
			var n = a.condition;
			(n.callback || function() {
				return this.chartWidth <= e(n.maxWidth, Number.MAX_VALUE) && this.chartHeight <= e(n.maxHeight, Number.MAX_VALUE) && this.chartWidth >= e(n.minWidth, 0) && this.chartHeight >= e(n.minHeight, 0)
			}).call(this) && h.push(a._id)
		};
		C.prototype.currentOptions =
			function(e) {
				function q(e, c, k, r) {
					var f;
					a.objectEach(e, function(a, b) {
						if(!r && -1 < F(b, ["series", "xAxis", "yAxis"]))
							for(a = u(a), k[b] = [], f = 0; f < a.length; f++) c[b][f] && (k[b][f] = {}, q(a[f], c[b][f], k[b][f], r + 1));
						else h(a) ? (k[b] = n(a) ? [] : {}, q(a, c[b] || {}, k[b], r + 1)) : k[b] = c[b] || null
					})
				}
				var x = {};
				q(e, this.options, x, 0);
				return x
			}
	})(K);
	return K
});